Future -> 代表的是未來的一個憑據(jù)
public interface Future<T> {
T get() throws InterruptedException;
}
AsynFuture -> Future具體實現(xiàn)類
public class AsynFuture<T> implements Future<T> {
private volatile boolean done = false;
private T result;
public void done(T result){
synchronized (this){
this.result = result;
this.done = true;
this.notifyAll();
}
}
/**
* 輪詢 沒有完成等待
*/
@Override
public T get() throws InterruptedException {
synchronized (this) {
while (!done) {
this.wait();
}
}
return result;
}
}
FutureService -> 橋接Future和FutureTask
public class FutureService {
/**
* 需進(jìn)程等待
*/
public <T> Future<T> submit(final FutureTask<T> task) {
AsynFuture<T> asynFuture = new AsynFuture<>();
new Thread(() -> {
T result = task.call();
asynFuture.done(result);
}).start();
return asynFuture;
}
/**
* 運行完 自動回調(diào)
* 無需進(jìn)程等待
*/
public <T> Future<T> submit(final FutureTask<T> task, final Consumer<T> consumer) {
AsynFuture<T> asynFuture = new AsynFuture<>();
new Thread(() -> {
T result = task.call();
asynFuture.done(result);
consumer.accept(result);
}).start();
return asynFuture;
}
}
FutureTask -> 將你的調(diào)用邏輯進(jìn)行了隔離
public interface FutureTask<T> {
T call();
}
需要時回調(diào)
/**
* Future -> 代表的是未來的一個憑據(jù)
* FutureTask -> 將你的調(diào)用邏輯進(jìn)行了隔離
* FutureService -> 橋接Future和FutureTask
*/
public class SyncInvoker {
public static void main(String[] args) throws InterruptedException {
FutureService futureService = new FutureService();
Future<String> future = futureService.submit(() -> {
try {
Thread.sleep(10001);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "FINISH";
});
System.out.println("==============");
System.out.println("do other thing.");
Thread.sleep(1000);
System.out.println("==============");
/**
* 調(diào)用也形成了阻塞
*/
System.out.println(future.get());
}
}
運行
==============
do other thing.
==============
FINISH
運行完自動回調(diào)
//**
* Future -> 代表的是未來的一個憑據(jù)
* FutureTask -> 將你的調(diào)用邏輯進(jìn)行了隔離
* FutureService -> 橋接Future和FutureTask
*/
public class SyncInvoker {
public static void main(String[] args) throws InterruptedException {
FutureService futureService = new FutureService();
futureService.submit(() -> {
try {
Thread.sleep(10001);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "FINISH";
},System.out::println);
System.out.println("==============");
System.out.println("do other thing.");
Thread.sleep(1000);
System.out.println("==============");
}
}