Future模式简述
- 传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理。
Futrue模式下,调用方式改为异步。 - Futrue模式的核心在于:充分利用主函数中的等待时间,利用等待时间处理其他任务,充分利用计算机资源。
主要角色
- Main:系统启动,调用Client发出请求
- Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData
- Data:返回数据的接口
- FutureData:Futrue数据,是一个虚拟的数据,需要装配RealData
- RealData:真实数据,构造比较慢。
JDK内置实现
——-jdk中已经内置future模式的实现。其中最重要的事模块是FutrueTask类,它实现了Runnable接口,作为单独的线程运行,在其run() 方法中,通过Sync内部类,调用Callable接口,并维护Callable接口的返回对象。使用FutureTask.get()方法,返回Callable接口的返回对象。
具体使用如下:
RealData.java
package com.y.www;
import java.util.concurrent.Callable;
/**
* @description:
* @author: lbYue
* @date: Created in 14:11 2018/1/9
*/
public class RealData implements Callable<String> {
private String para;
public RealData(String para){
this.para = para;
}
@Override
public String call() throws Exception {
//真实的业务逻辑
StringBuffer sb = new StringBuffer();
for (int i= 0 ;i < 10 ; i++){
sb.append(para);
try {
Thread.sleep(100);
}catch (InterruptedException e){
}
}
return sb.toString();
}
}
MainTest.java
package com.y.www;
import java.util.concurrent.*;
/**
* @description:
* @author: lbYue
* @date: Created in 14:15 2018/1/9
*/
public class MainTest {
public static void main(String[] args) throws InterruptedException,ExecutionException{
FutureTask<String> future = new FutureTask<String>(new RealData("a"));
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(future);
System.out.println("请求完毕!");
try {
System.out.println("我在睡觉别打扰我!2秒后回应");
Thread.sleep(2000);
}catch (InterruptedException e){
}
System.out.println("数据处理完成:"+future.get());
}
}
控制台输出结果