/**
* 数据接口
*/
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. LOJ6437 PKUSC2018 PKUSC

    带劲的计算几何[这一定是我WC之前开的最后一道计几!!! 每个点画个圆然后看一下交点 然后判断是多边形内还是多边形外 这个就是取圆上中点然后射线法 eps我1e-8才过 不知道为啥有的人说只能开1e- ...

  2. Linux下安装gnuplot

    sudo apt-get install gnuplot 但是在 terminal 里面输入: gnuplot 提示 Terminal type set to unknown.解决方法是安装 x11: ...

  3. uwsgi部署django项目

    一.更新系统软件包 yum update -y 二.安装软件管理包及依赖 yum -y groupinstall "Development tools" yum install o ...

  4. 2019牛客多校第六场 B - Shorten IPv6 Address 模拟

    B - Shorten IPv6 Address 题意 给你\(128\)位的二进制,转换为十六进制. 每\(4\)位十六进制分为\(1\)组,每两组用一个\(":"\)分开. 每 ...

  5. 【PBFT】拜占庭容错

    共识机制堪称区块链的核心.我们知道,EOS.Hyperledger以及Stellar等著名的项目,都采用了BFT(拜占庭容错)共识机制,那么,BFT到底是什么鬼?和其它共识机制相比,又有什么优势和特点 ...

  6. MySqL rownum 序号 类似于 oracle的rownum

    mysql中没有 rownum 序号的功能,所以需要自己去实现序号的功能. @rownum 只是一个变量 可以换为 @i 等其他变量,但必须有@符号 SELECT @rownum:=@rownum+1 ...

  7. bugku | login2(SKCTF) 200

    在响应包里面发现tips,base64解码后看到提示信息: $sql="SELECT username,password FROM admin WHERE username='". ...

  8. [CSP-S模拟测试]:w(树上DP)

    题目背景 $\frac{1}{4}$遇到了一道水题,双完全不会做,于是去请教小$D$.小$D$看了${0.607}^2$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac ...

  9. poj-1021--2D-Nim--点阵图同构

    2D-Nim Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4136   Accepted: 1882 Descriptio ...

  10. PHP连接FTP服务的简单实现

    PHP连接FTP服务: <?php class Ftp { private $connect; private $getback; /** * ftp连接信息 * @var array */ p ...