Future Parttern 先给你这张提货单
Future是未来,预期的意思,Thread-permessage模式是指将任务交给其他线程来做,但是如果想知道处理的结果,就要使用Future模式,它的典型应用时执行一个需要花一些时间的方法,会立即返回一个future提货单,然后调用方可以继续处理自己的业务逻辑,然后需要的时候再查看future是否返回,一直等到future结果已经处理完毕。
thread-pre-message模式发送的请求很像这样 host.request(10,‘A’),只有请求,没有返回值,而future pattern模式发送请求后会马上就要有返回值,类似这样 Data data=host.request(10,'A'),但是这个data并不是程序执行的结果,只是一个提货单,过一段时间后,可以使用data.getContent()来获取真正的运行结果,调用getContent方法时,如果还没处理完毕,就要等待到处理好为止。
public class FutureThreadTest { /**
* @param args
*/
public static void main(String[] args) {
System.out.println("main begin.");
Host host = new Host();
Data data1 = host.request(,'A');
Data data2 = host.request(,'B');
Data data3 = host.request(,'C'); System.out.println("main other job begin");
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("main other job end"); System.out.println("data1 = " + data1.getContent());
System.out.println("data2 = " + data2.getContent());
System.out.println("data3 = " + data3.getContent());
} } class Host {
public Data request(final int count, final char c) {
System.out.println("request(" + count + "," + c + ")begin");
final FutureData future = new FutureData();
new Thread() {
@Override
public void run() {
RealData realdata = new RealData(count, c);
future.setRealData(realdata);
}
}.start(); System.out.println("request(" + count + ", " + c + ")end"); return future;
}
} interface Data{
public abstract String getContent();
} class FutureData implements Data{ private RealData realdata = null;
private boolean ready = false; public synchronized void setRealData(RealData realdata){
if(ready){
return;
} this.realdata=realdata;
this.ready=true; notify();
} @Override
public synchronized String getContent() {
while(!ready){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realdata.getContent();
}
} class RealData implements Data { private final String content; public RealData(int count, char c) {
System.out.println("making realdata(" + count + "," + c + ")begin");
char[] buffer = new char[count];
for (int i = ; i < count; i++) {
buffer[i] = c; try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("making realdata(" + count + "," + c + ")end");
this.content = new String(buffer);
} @Override
public String getContent() {
return content;
}
}
Future Parttern 先给你这张提货单的更多相关文章
- 多线程系列之十:Future模式
一,Future模式 假设有一个方法需要花费很长的时间才能获取运行结果.那么,与其一直等待结果,不如先拿一张 提货单.获取提货单并不耗费时间.这里提货单就称为Future角色获取Future角色的线程 ...
- 多线程设计模式——Read-Write Lock模式和Future模式分析
目录 多线程程序评价标准 任何模式都有一个相同的"中心思想" Read-Write Lock 模式 RW-Lock模式特点 冲突总结 手搓RW Lock模式代码 类图 Data类 ...
- Entity Framework 学习笔记(一)之数据模型 数据库
关于Entity Framework 数据模型 的开发有三种模式:1.引用数据库方式:2.在VS中新建EF空模型Model 方式:3.Code 方式 Entity Framework 数据模型 ...
- java Future 接口介绍
(转自:http://blog.csdn.net/yangyan19870319/article/details/6093481) 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java ...
- 张艾迪(创始人):Be.Time+Cr.Idear的创新理念
The World No.1 Girl :Eidyzhang The World No.1 Internet Girl :Eidyzhang AOOOiA.global Founder :Eidyzh ...
- 【Java线程】Callable和Future
Future模式 Future接口是Java线程Future模式的实现,可以来进行异步计算. Future模式可以这样来描述: 我有一个任务,提交给了Future,Future替我完成这个任务.期间我 ...
- Future 模式介绍
假设一个任务执行需要花费一些时间,为了省去不必要的等待时间,可以先获取一个提货单,即future,然后继续处理别的任务,知道货物到达,即任务完成得到结果,此时可以使用提货单提货,即通过future得到 ...
- 闲谈Future模式-订蛋糕
一. Future模式简介 Future有道翻译:n. 未来:前途:期货:将来时.我觉得用期货来解释比较合适.举个实际生活中例子来说吧,今天我女朋友过生日,我去蛋糕店准备给女朋友定个大蛋糕,超级大的那 ...
- Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)
1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...
随机推荐
- 戏说 .NET GDI+系列学习教程(二、Graphics类的方法)
一.DrawBezier 画立体的贝尔塞曲线 private void frmGraphics_Paint(object sender, PaintEventArgs e) { Graphics g ...
- Linux启动过程的C语言代码分析
1. main函数 参见上方http://www.cnblogs.com/long123king/p/3543872.html,代码跳转到main函数. arch/x86/boot/main.c 1: ...
- hql 语法与详细解释
HQL查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此 Hi ...
- VIM编辑器进阶配置
vim自定义设置 可以选择需要的功能添加至 ~/.vimrc 打开注释使之生效. " 让 vim 关闭所有扩展的功能,尽量模拟 vi 的行为. set nocompatible ...
- Maven Optional & Exclusions使用区别
Optional和Exclusions都是用来排除jar包依赖使用的,两者在使用上却是相反. Optional定义后,该依赖只能在本项目中传递,不会传递到引用该项目的父项目中,父项目需要主动引用该依赖 ...
- pytest--fixture---自动应用
import pytest@pytest.fixture(autouse=True)-----加上auto=True,每个方法执行前都会自动登陆def login_r(open_browser): p ...
- usb-host与外设之间的通信(一)
迫于需要开始一个app实现安卓手机控制外设,要学习一下usb-host这方面的知识,所以记录一下自己的学习经历.关于usb-host这一块的资料国内还是比较少的,我只能学到哪里就记录到哪里了. 简单来 ...
- zipinfo - 列出关于某个ZIP压缩包的详细信息
总览 SYNOPSIS zipinfo [-12smlvhMtTz] file[.zip] [file(s) ...] [-x xfile(s) ...] unzip -Z [-12smlvhMtTz ...
- Spring BeanName生成规则
1. XML方式 <bean class="com.fishblog.service.UserService"></bean> beanName: com. ...
- GYM 101933E 状态压缩 + 记忆化搜索
题意:我方有n个士兵,敌方有m个,每方士兵都有一个血量,现在有k轮无差别炮火打击,每次都会从存活的士兵中随机选一人,这名士兵的HP就-1,问对方被团灭的概率有多大? 思路:因为n和m的范围很小,我们可 ...