Future模式
当一个任务任务执行时间很长,调用者正常会阻塞很久。为避免这种情况出现,可以先返回一个凭据给调用者。后面调用者通过这个凭据查看任务执行结果。异步非阻塞也是类似思想。
Future设计模式实现
- future接口
/**
* 提供 获取执行确认结果和判断是否执行完成
*/
public interface Future<T> {
// 返回计算后结果 该方法会陷入阻塞状态
T get() throws InterruptedException;
// 判断任务是否已经被执行完成
boolean done();
}
- future接口实现类
/**
* Future 接口的实现类
* 增加finish方法 用来接收任务被完成的通知 设置任务执行结果
*/
public class FutureTask<T> implements Future<T> {
// 任务执行结果
private T result;
// 任务是否被完成
private boolean isDone = false;
// 定义对象锁
private final Object LOCK = new Object();
@Override
public T get() throws InterruptedException {
synchronized (LOCK){
// 任务没有被执行完阻塞
while (!isDone){
LOCK.wait();
}
// 执行完成后返回结果
return result;
}
}
// finish 方法用来接收任务被完成的通知 设置任务执行结果
protected void finish(T result){
synchronized (LOCK){
// balking 设计模式
if (isDone) return;
//处理传入的result值 设置返回值 是否完成 唤醒阻塞休息室的线程
this.result = result;
this.isDone = true;
LOCK.notifyAll();
}
}
@Override
public boolean done() {
return this.isDone;
}
}
- 设计提交任务接口
/**
* 用于提交任务
*/
public interface FutureService<IN,OUT> {
// 提供不需要返回值的任务提交方法 Future.get() 方法返回null
Future<?> submit(