JAVA版Future模式实现代码
2018-01-18 18:21
357 查看
JAVA版Future模式实现代码
思路:
1、调用方发送数据给被调用方并起一个线程等待数据填充,
2、被调用方立马返回数据并启动一个线程处理,
3、处理完把数据交给调用方并唤醒调用方线程。
调用方代码:
被调用方代码:
看了一下别人的future模式,把锁放在服务器端会更为合理一些!所以,改进版本:
Client:
Service:
使用JDK内置的Future模式的接口实现Future,让我更深入的了解了future模式
1、要利用FutureTask来完成的任务,实现Callable接口重写call方法;
2、服务端接收任务利用线程池来完成具体的任务;
3、客户端开启新线程来提取任务结果。
FutureTask源码阅读与理解传送门
client-callable:
client:
futurework:
思路:
1、调用方发送数据给被调用方并起一个线程等待数据填充,
2、被调用方立马返回数据并启动一个线程处理,
3、处理完把数据交给调用方并唤醒调用方线程。
调用方代码:
import java.util.concurrent.locks.ReentrantLock; /** * @author 作者:hui E-mail: 137437006@qq.com * @version 创建时间:2018年1月12日 下午5:11:46 * 类说明 */ public class FutureClient { public String futureMsg; public String sendMsg; public ReentrantLock lock = new ReentrantLock(); public FutureServer futureServer = new FutureServer(); public void sendMsg(){ this.sendMsg = "客户端发送数据"; System.out.println("客户端发送数据"); futureServer.acceptMsg(this); System.out.println("已经发送了异步数据,下一步获取异步数据"); getFutureMsg(); System.out.println("客户端任务结束,做其他事情……"); } public void getFutureMsg(){ new Thread(){ @Override public void run() { try { synchronized (lock) { lock.wait(); } System.out.println("客户端接收到数据了:"+futureMsg); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } public static void main(String[] args) { FutureClient client = new FutureClient(); client.sendMsg(); } }
被调用方代码:
/** * @author 作者:hui E-mail: 137437006@qq.com * @version 创建时间:2018年1月12日 下午5:11:28 * 类说明 */ public class FutureServer { private FutureClient futureClient; public void acceptMsg(FutureClient futureClient){ this.futureClient = futureClient; System.out.println("服务器收到数据:"+futureClient.sendMsg); new Thread(){ @Override public void run() { try { Thread.sleep(5000); futureClient.futureMsg = "服务器异步数据返回"; synchronized (futureClient.lock) { futureClient.lock.notify(); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); return; } }
看了一下别人的future模式,把锁放在服务器端会更为合理一些!所以,改进版本:
Client:
/** * @author 作者:hui E-mail: 137437006@qq.com * @version 创建时间:2018年1月18日 * 类说明 */ public class FutureClient2 { public String futureMsg; public String sendMsg; public FutureServer2 futureServer = new FutureServer2(); public void sendMsg(){ this.sendMsg = "客户端发送数据"; System.out.println("客户端发送数据"); futureServer.acceptMsg(this); System.out.println("已经发送了异步数据,下一步获取异步数据"); System.out.println("客户端主线任务结束,做其他事情……"); } public void getFutureMsg(){ new Thread(){ @Override public void run() { futureMsg = futureServer.getMsg(); System.out.println("客户端获取数据:"+futureMsg); } }.start(); } public static void main(String[] args) { FutureClient2 client = new FutureClient2(); client.sendMsg(); client.getFutureMsg(); } }
Service:
/** * @author 作者:hui E-mail: 137437006@qq.com * @version 创建时间:2018年1月18日 * 类说明 */ public class FutureServer2 { private FutureClient2 futureClient; private String data; private Boolean b = false; public void acceptMsg(FutureClient2 futureClient){ this.futureClient = futureClient; System.out.println("服务器收到数据:"+futureClient.sendMsg); new Thread(){ @Override public void run() { try { Thread.sleep(5000); data = "服务器异步数据返回"; synchronized (futureClient) { b = true; futureClient.notify(); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); return; } public String getMsg(){ synchronized (futureClient) { if(!b){ try { futureClient.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } return data; } }
使用JDK内置的Future模式的接口实现Future,让我更深入的了解了future模式
1、要利用FutureTask来完成的任务,实现Callable接口重写call方法;
2、服务端接收任务利用线程池来完成具体的任务;
3、客户端开启新线程来提取任务结果。
FutureTask源码阅读与理解传送门
client-callable:
import java.util.concurrent.Callable; public class CallableTask implements Callable<String> { @Overri b901 de public String call() throws Exception { Thread.sleep(5000); return "Callable执行完毕"; } }
client:
/** * @author 作者:hui E-mail: 137437006@qq.com * @version 创建时间:2018年1月18日 * 类说明 */ public class FutureClient3 { public String futureMsg; public String sendMsg; public FutureWoker futureServer = new FutureWoker(); public void sendMsg(){ this.sendMsg = "客户端发送数据"; System.out.println("客户端发送数据"); futureServer.sendMsg(new CallableTask()); System.out.println("已经发送了异步数据,等待FutureWork工作完毕并获取异步数据"); System.out.println("客户端主线任务结束,做其他事情……"); } public void getFutureMsg(){ new Thread(){ @Override public void run() { try { System.out.println("客户端获取数据:"+futureServer.getMsg()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); } public static void main(String[] args) { FutureClient3 client = new FutureClient3(); client.sendMsg(); client.getFutureMsg(); } }
futurework:
/** * @author 作者:hui E-mail: 137437006@qq.com * @version 创建时间:2018年1月18日 * 类说明 */ public class FutureWoker { FutureTask<String> f = null; ExecutorService executor = Executors.newSingleThreadExecutor(); public String sendMsg(Callable<String> call){ System.out.println("异步线程开始调用"); f = new FutureTask<>(call); executor.execute(f); return "TRUE"; } public String getMsg() throws Exception{ String string = f.get(); executor.shutdown(); return string; } }
相关文章推荐
- 大话设计模式3 装饰模式 的java代码实现
- 设计模式之迭代器模式java实现代码
- 用java代码实现观察者模式
- Apriori挖掘频繁模式,关联规则(附代码实现 java+mysql)
- 大话设计模式4 代理模式 的java代码实现
- 并发模式Future ,JAVA内置模块Callable接口实现 实例
- java future模式 所线程实现异步调用
- Future模式Java实现
- Promise模式简介(Future) --- Java实现异步
- Java Future模式实现
- 模板设计模式,简单Java代码实现
- 设计模式学习笔记以及java代码实现
- 详解Java设计模式中的生产-消费者模式及代码实现
- JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)
- C++实现w3cshool设计模式教程--设计模式中的Java代码
- [置顶] java面试题:java中的单例设计模式及两种实现方法的代码举例
- 大话设计模式1 简单工厂模式 的java代码实现
- 设计模式之一(代码用java实现)
- 大话设计模式2 策略模式 的java代码实现
- 设计模式----单例模式UML图和代码实现(C#&JAVA)