java 多线程 Callable中的futrue模式
java实现Callable接口中用到了future模式,所以实现了这个接口就看到了有返回值,那它的基本原理是什么鬼,往下看。
何为future模式?
future模式有点类似于商品订单。在网上购物时,提交订单后,在收货的这段时间里无需一直在家里等候,可以先干别的事情。类推到程序设计中时, 当提交请求时,期望得到答复时,如果这个答复可能很慢。传统的时一直等待到这个答复收到时再去做别的事情,但如果利用Future设计模式就无需等待答复 的到来,在等待答复的过程中可以干其他事情。
应用场景:线程A需要线程B的执行结果,但没必要一直等待线程B执行完,这个时候可以先拿到未来的Future对象,等线程B执行完再来取真实结果。就是先让你看到,等一会儿用而已。
java模拟代码实现如下:
package com.ming.thread.one.future; //先封装一个data 接口 public interface Data { String getResult() throws InterruptedException; }
package com.ming.thread.one.future; public class RealData implements Data { protected String data; public RealData(String data) { this.data = data; } @Override public String getResult() { return data; } }
package com.ming.thread.one.future; //FutureData是Future模式的关键,它实际上是真实数据RealData的代理,封装了获取RealData的等待过程 public class FutureData implements Data { RealData realData = null; //FutureData是RealData的封装 boolean isReady = false; //是否已经准备好 public synchronized void setRealData(RealData realData) { if(isReady) return; this.realData = realData; isReady = true; notifyAll(); //RealData已经被注入到FutureData中了,通知getResult()方法 } @Override public synchronized String getResult() throws InterruptedException { if(!isReady) { wait(); //一直等到RealData注入到FutureData中 } return realData.getResult(); } }
package com.ming.thread.one.future; public class Client { public Data request(final String string) { final FutureData futureData = new FutureData(); new Thread(new Runnable() { @Override public void run() { // RealData的构建很慢,所以放在单独的线程中运行 RealData realData = new RealData(string); futureData.setRealData(realData); System.out.println("异步给realData设置值哦"); } }).start(); System.out.println("优先返回futureData对象"); return futureData; // 先直接返回FutureData } }
package com.ming.thread.one.future; public class Test { public static void main(String[] args) throws InterruptedException { Client client = new Client(); //这里会立即返回,因为获取的是FutureData,而非RealData Data data = client.request("name"); //这里可以用一个sleep代替对其他业务逻辑的处理 //在处理这些业务逻辑过程中,RealData也正在创建,从而充分了利用等待时间 Thread.sleep(2000); //使用真实数据 System.out.println("数据="+data.getResult()); } }
不明觉厉..
转:http://www.cnblogs.com/winkey4986/p/6203225.html