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

最新文章

  1. linux 负载均衡
  2. java 绘图
  3. Shanghai Regional Online Contest 1004
  4. Codeforces Beta Round #8
  5. MDT部署中命令行脚本的使用。
  6. 转:Java NIO系列教程(五) 通道之间的数据传输
  7. STL学习笔记序言
  8. 开启sa账户以及如何用JDBC进行连接
  9. linux 目录及文件的命名规则、ls操作
  10. 约瑟夫环(java面向对象实现)
  11. HTML5录音控件
  12. 麻瓜之我要学sql,啦啦啦啦
  13. SWING中文件的上传
  14. 2017 百度杯丶春秋欢乐赛 writeup
  15. float和double的最大值和最小值
  16. Python 3.6安装yaml时报"AttributeError: module 'pip' has no attribute 'main'"和“Non-zero exit code”错误
  17. react与umi
  18. [NOIp2013普及组]车站分级
  19. Java 输入/输出——处理流(ObjectIO)
  20. BZOJ3173:[TJOI2013]最长上升子序列(Splay)

热门文章

  1. spring扩展点之四:Spring Aware容器感知技术,BeanNameAware和BeanFactoryAware接口,springboot中的EnvironmentAware
  2. 微服务理论之四:SOA
  3. 关于openstack自动化安装的一点思考
  4. vue.js 使用高德地图
  5. VUE之使用百度地图API
  6. mysql错误代号大全
  7. 关于Android阻塞的解决方法
  8. 面试题: 数据库 已看1 group by 和order by的练习 sql语句练习简单 有用
  9. 在linux系统个人目录下安装新版python
  10. windows10 启用Linux子系统