/**
* 数据接口
*/
public interface Data {
public String getResult();
}

/**
* 最终需要使用的数据模型
*/
public class RealData implements Data{
protected final String result;
public RealData(String result) { //模型大的数据,构造比较慢用户等待很久
StringBuffer sb = new StringBuffer();
sb.append(result);
for (int i = 0; i < 20; i++) {
sb.append(i);
sb.append(" ");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.result = sb.toString();
} @Override
public String getResult() {
return result;
}
}

/**
* 真实数据的代理,封装真实数据的等待过程
*/
public class FutureData implements Data {
protected RealData realData = null;
protected boolean isReady = false;
public synchronized void setRealData(RealData realData){
if (isReady){
return;
}
this.realData = realData;
isReady = true;
notifyAll();//RealData已经被注入,通知getResult()
}
@Override
public synchronized String getResult() { //等待RealData被注入
while (!isReady){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realData.result;
}
}

public class Client {
public Data request(final String queryStr){
final FutureData future = new FutureData();
new Thread(){
@Override
public void run() { //RealData的构造很慢,所以在单独的线程中进行
RealData realData = new RealData(queryStr);
future.setRealData(realData);
}
}.start();
return future; //立即返回
}
}
/**
* Future模式的简单实现
* 参与者
* Main:系统启动,调用Client发出请求
* Client:返回Data对象,立即返回FutureData,并开启线程装配RealData
* Data:返回数据的接口
* FutureData:封装真实数据,需要装配RealData
* RealData:真实数据
*/
public class Main {
public static void main(String[] args){
Client client = new Client();
Data data = client.request("name"); //立即返回的FutureData
System.out.println("请求完毕");
try {
Thread.sleep(2000); //模拟其他业务,这段时间RealData被创建,充分利用时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("data:"+data.getResult());//真实数据
}
//请求完毕
//data:name0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
}

jdk自带

  • boolean cancel(boolean mayInterruptIfRunning) //取消任务
  • boolean isCancelled() //是否已经取消
  • boolean isDone() //是否已完成
  • V get() //取得返回对象
  • V get(long timeout, TimeUnit unit) //取得返回对象,可以设置超时时间

import java.util.concurrent.Callable;
/**
* 使用JDK内置的Future
*/
public class RealDataJDK implements Callable<String> {
private String result;
public RealDataJDK(String result) {
this.result = result;
}
@Override
public String call() throws Exception {
//执行很慢的业务逻辑
StringBuffer sb = new StringBuffer();
sb.append(result);
for (int i = 0; i < 10; i++) {
sb.append(i);
sb.append(" ");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask; public class MainJDK {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> future= new FutureTask<>(new RealDataJDK("name"));
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(future);
System.out.println("请求完毕");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//取得call()方法的返回值,如果此时call()方法没有执行完成,则依然会等待
System.out.println("data:"+future.get());
System.out.println("执行完成");
executor.shutdown();
}
}

Future模式的简单实现的更多相关文章

  1. Future模式的学习以及JDK内置Future模式的源码分析

    并发程序设计之Future模式 一).使用Future模式的原因 当某一段程序提交了一个请求,期待得到一个答复,但服务程序对这个请求的处理可能很慢,在单线程的环境中,调用函数是同步的,必须等到服务程序 ...

  2. Future模式

    Future模式简介 Future模式有点类似于网上购物,在你购买商品,订单生效之后,你可以去做自己的事情,等待商家通过快递给你送货上门.Future模式就是,当某一程序提交请求,期望得到一个答复.但 ...

  3. java Future 模式

    考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓 的現象,所以我們希望在文件開啟之後,仍有一個背景作業持 ...

  4. 多线程之Future模式

    详细参见葛一名老师的<Java程序性能优化> Futrue模式:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果 ...

  5. 彻底理解Java的Future模式

    先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...

  6. Java多线程Future模式

    Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分 ...

  7. 【并发编程】Future模式及JDK中的实现

    1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执行很慢,程序就必须等待,直到执行结束才返回结果:但有时我们可能并不急着需要其中某行的执 ...

  8. [面试]future模式

    Future模式 什么是future模式? 传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理. Futrue模式下,调用方式改为异步. Futrue模式的核心在于:充分利用 ...

  9. Future模式衍生出来的更高级的应用

    再上一个场景:我们自己写一个简单的数据库连接池,能够复用数据库连接,并且能在高并发情况下正常工作. 实现代码1: package test; import java.util.concurrent.C ...

随机推荐

  1. 03.父工程pom、整合测试、SpringBootApplication注解

    父工程 idea点击spring-boot-starter-parent找到父工程spring-boot-dependencies模仿配置 父工程 <?xml version="1.0 ...

  2. 插入排序->希尔排序

    /** * 插入排序 */ public class InsertSort { public static void main(String[] args){ int[] arr = {5,5,2,6 ...

  3. PL/SQL-FOR UPDATE 与 FOR UPDATE OF的区别

    PL/SQL-FOR UPDATE 与 FOR UPDATE OF的区别 数据库 oracle for update of   和   for update区别     select * from T ...

  4. 2.xml约束技术----------dtd约束

    1.xml的约束 (1)为什么需要定义约束了 比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name age等,但是如果在xml文件中写了一个元素<猫>,发 ...

  5. idea 离线安装 lombok插件

    Lombok简介 Lombok是Java语言的实用工具,确切的说,应该说是一个很好用的插件,对,插件!可以用来帮助开发人员消除Java代码的冗长,尤其是对于简单的Java对象(POJO),它通过注解实 ...

  6. centos 6.5 配置 DNS

    编辑 vi /etc/resolv.conf 修改 DNS nameserver 202.96.134.133 nameserver 202.96.128.86 nameserver 8.8.8.8 ...

  7. hihocoder 1014: Trie树(Trie树模板题)

    题目链接 #include<bits/stdc++.h> using namespace std; ; struct T { int num; T* next[]; T() { num=; ...

  8. 微信小程序中的自定义组件 以及 相关的坑

    Step1 我们初始化一个小程序(本示例基础版本库为 1.7 ),删掉里面的示例代码,并新建一个 components 文件夹,用于存放我们以后开发中的所用组件,今天我们的目的是实现一个 首页 组件, ...

  9. Yii2 kineditor

    用 kineditor实现异步 <table cellspadding=5 width=400> <tr height='150'> <td valign="t ...

  10. Word图片粘贴上传控件,直接粘贴图片到编辑器-DEDE

    很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...