/**
* 数据接口
*/
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. 前端-个人网页开发最常用的插件Superslide 与 swiper

    给初入前端的同学,安利2个轮播图插件 SuperSlide 与 Swiper ! SuperSlide PC端与移动端 的轮播图特效都是分开写2个js插件,而Swiper 基本一个插件可以写PC端与移 ...

  2. python-字符、字符串、函数处理

    1.列表元祖字典集合 列表 list = ["a", "b", "c", "d"] 元祖 tup = (1, 2, 3, ...

  3. 如何在pycharm中进入shell脚本调试代码

    首先在Teramal终端 输入python manage.py shell 然后进行下图操作来调试代码

  4. APP开发者如何从应用程序中赚钱?

    付费应用程序,这是应用程序最基本的赚钱方式之一,也是拥有巨大潜力的赚钱方式之一.但有一个问题开发者必须扪心自问,您的程序用户是否有一批粉丝级用户的认可,或对您应用程序品牌的认可   蝉大师APP推广工 ...

  5. 转载 ldd3环境配置

    ldd3(<linux设备驱动程序>)里面使用的正是Linux2.6.10内核,如果内核不同,使用课本里的代码会出现各种问题,所以搭建与课本一样内核版本的环境,用来学习. 尝试过使用ubu ...

  6. 七、单例设计模式共享数据分析、解决、call_once

    一.设计模式大概谈 代码的一些写法,与常规的写法不太一样,程序灵活,维护起来很方便,但是别人接管.阅读代码很痛苦. 用设计模式理念写出来的代码很晦涩.<< head first>&g ...

  7. SyntaxError: missing ] after element list

    在前端页面js报错,找了很久没找到原因. 后来发现是后台向前端输出json字符串,而前端接收是html格式,需要将后台json字符串改成正常字符串就可以输出,或者通过ajax的方式接收json字符串.

  8. linux知识总结与问题总结

    一直以来经常听到LINUX,但是自己学习的也不深,也没有花时间来梳理一下自己的理解.趁着新年这段时间,好好梳理一下. 在理解LINUX前,先简单理解一下 一:操作系统这个概念. 操作系统就是与电脑中的 ...

  9. tarjan复习笔记

    tarjan复习笔记 (关于tarjan读法,优雅一点读塔洋,接地气一点读塔尖) 0. 连通分量 有向图: 强连通分量(SCC)是个啥 就是一张图里面两个点能互相达到,那么这两个点在同一个强连通分量里 ...

  10. offsetleft 和 style.left 的区别

    offsetLeft 获取的是相对于父对象的左边距: left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距: 如果父div的position定义为rel ...