1.手动实现和jdk1.5实现
package com.es.Demo;
import java.util.concurrent.*;
// future设计模式:当某个业务耗时较长,但是主线程不想等待这个业务执行完毕,需要执行其他业务时.可以
// Future模式的客户端在得到这个返回结果后并不急于对其进行处理而是调用其他业务逻辑,充分利用等待时间,
// 这就是Future模式的核心所在。在完成其他业务处理后,最后再使用返回比较慢的Future数据。这样在整个调用中就不存在无谓的等待,充分利用所有的时间片,从而提高了系统响应速度。
public class Client {
// 获取真实数据并快速返回
public Data req() {
FutureData futureData = new FutureData();
new Thread() { // 开启新线程获取真实数据
public void run() {
RealData realData = new RealData();
futureData.setResult(realData); // 注入
}
}.start();
return futureData;
}
public static void main(String[] args) {
Client c = new Client();
Data futureData = c.req();
// dosomething
System.out.println("dosomething");
// 获取数据(当数据没有准备好时.阻塞,准备ok,notifyAll)
futureData.getResult();
// jdk1.5实现
FutureTask futureTask = new FutureTask(new Callable() {
@Override
public String call() {
StringBuffer buffer = new StringBuffer("s");
for (int i = 1; i < 100; i++) {
buffer.append("s");
}
return buffer.toString();
}
;
});
// 交给线程池
ExecutorService exe = Executors.newFixedThreadPool(1);
exe.submit(futureTask);
// 轮询判断数据
while (futureTask.isDone()) {
try {
System.out.println(futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
// jdk1.8 使用CompletableFuture实现 提供四种静态方法构造 CompletableFuture对象.下回分解.......
}
package com.es.Demo;
// 数据接口 futureData 和 realData需实现
public interface Data {
public String getResult();
}
package com.es.Demo;
// 包装真实数据,快速返回.注入真实数据
public class FutureData implements Data {
private RealData realData = null;
private volatile boolean flag = false;
@Override
public synchronized String getResult() {
while (!flag) {// 轮询判断数据是否准备,无 则阻塞.造成cpu高占用
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realData.result;
}
// 注入真实数据对象或数据
public synchronized void setResult(RealData realData) {
if (flag){
return;
} // 提高效率 数据好了,无需再走下面的代码
this.realData = realData;
flag = true;
notifyAll();
}
}
// 真实数据构建--耗时业务
public class RealData implements Data {
protected String result;
public RealData() {
try {
Thread.sleep(3000);// 模拟耗时业务
} catch (InterruptedException e) {
e.printStackTrace();
}
String str="success";
this.result=str;
}
@Override
public String getResult() {
return result;
}
}
记录学习过程,有雷同见谅!!!