/**
* 数据接口
*/
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. 21.使用LinkedBlockingQueue模拟生产者与消费者

    import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; import java.util.co ...

  2. PHP 配置多站点多目录

    Apache配置httpd.conf #增加监听端  可以通过netstat -n -a查看端口是否开启# Listen: Allows you to bind Apache to specific ...

  3. Python中使用"subplot"在一张画布上显示多张图

    subplot(arg1, arg2, arg3) arg1: 在垂直方向同时画几张图 arg2: 在水平方向同时画几张图 arg3: 当前命令修改的是第几张图 t = np.arange(0,5,0 ...

  4. Yii2.0基础框架

    前言:最近在用php写一个项目的接口,所以需要学习一下Yii的框架,也在这里记录一下. 整体结构 ssets文件夹:assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问p ...

  5. 【leetcode】883. Projection Area of 3D Shapes

    题目如下: 解题思路:分别求出所有立方体的个数,各行的最大值之和,各列的最大值之和.三者相加即为答案. 代码如下: class Solution(object): def projectionArea ...

  6. 看图了解RocksDB

    它是一个高性能的Key-Value数据库.设计了完善的持久化机制,同时保证性能和安全性.能够良好的支持范围查询,因为K-V记录就是按照Key来排序的. 下图为写入的流程: ​ 可以看到主要的三个组成部 ...

  7. java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

    首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...

  8. linux 正则表达式与实践

    正则表达式基础 准备 (1)alias grep='grep --color=auto' 易于显示 (2)LC_ALL=C,字符集,设置环境变量,字符顺序 基础正则 1)^word  匹配以Word开 ...

  9. Divideing Jewels

    Divideing Jewels 时间限制: 1 Sec  内存限制: 128 MB提交: 63  解决: 17[提交][状态] 题目描述 Mary and Rose own a collection ...

  10. hdu 5396 Expression

    考虑到此题麻烦了某hust大神&体现出了自己数学能力的欠缺 虽然最近一直比较忙 还是把这题的题解写下来吧 首先看完数据范围后 应该有不少人会反应到是$n^3$的DP 以$F[i][j]$表示从 ...