此种方式将Future与Task分离开来。导致finish()方法暴露出来。被外部调用。更优的方式将Future与Task结合起来。参考JDK FutureTask类
不便于管理。
如果要实现Cancle,参考FutureTask在内部将callback与future分离开来的设计
public interface Future<T>{
//获取返回值
T get() throws InterruptedException;
//查看是否结束
boolean done();
}
public interface FutureService<IN,OUT>{
Future<?> submit(Runnable r);
Future<OUT> sunmit(Task<IN,OUT> task,In input);
static <T,R> FutureService<T,R> newService(){
return new FutureServiceImpl();
}
}
public class FutureTask<T> implements Future<T>{
private T result;
private boolean isDone = false;
private final Object Lock= new Object;
public T get() throws InterruptedException{
synchronized(LOCK){
while(!isDone){
Lock.wait();
}
}
return result;
}
protected void finish(T result){
synchronized(LOCK){
if(isDone){
return;
}
this.result = result;
this.isDone = true;
LOCK.notifyAll();
}
}
public boolean done(){
return isDone;
}
}
public class FutureServiceImpl<IN,OUT> implements FutureService<IN,OUT>{
public Future<?> submit(Runnable r){
final FutureTask<void> futrure = new FutureTask<>();
new Thread(()——>{
r.run();
future.finish(null);
}
).start();
return futrure;
}
public Future<OUT> submit<Task<IN,OUT> task,IN input,Callback<OUT> callback){
final FutureTask<OUT> futrure = new FutureTask<>();
new Thread(() ——>{
OUT result = task.get(input);
future.finish(result);
if(callback != null){
callback.call(result);
}
}).start();
return future;
}
}