future模式
- 首先,需要一個Future接口,用以獲取值
public interface Future<T> {
T get();
}
- 然後,需要一個FutureTask接口,用以定義返回值的方法
public interface FutureTask<T> {
T call();
}
- 再然後,需要一個FutureService,粘合Future和FutureTask
public class FutureService<T> {
public Future<T> submit(FutureTask<T> task){
FutureImp<T> future = new FutureImp<>();
new Thread(()->{
T date = task.call();
System.out.println("get value");
future.setDate(date);
}).start();
return future;
}
}
- 最後,需要一個Future的實現類
public class FutureImp<T> implements Future<T> {
private T date;
private volatile boolean finish = false;
public void setDate(T date){
synchronized (this){
this.date = date;
finish = true;
notifyAll();
}
}
@Override
public T get() {
synchronized (this){
while (!finish){
try {
wait();
} catch (InterruptedException e) {
continue;
}
}
}
return date;
}
}
例子
public class Demo {
public static void main(String[] args) {
FutureTask<String> futureTask = ()->{
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "OK";
};
FutureService<String> fs = new FutureService<>();
Future<String> submit = fs.submit(futureTask);
System.out.println("get back value soon");
System.out.println(submit.get());
}
}