public interface Future{
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}
Future的實(shí)現(xiàn)類FutureTask特點(diǎn):回調(diào)函數(shù)done()方法贞盯,當(dāng)一個(gè)任務(wù)執(zhí)行結(jié)束后懒棉,會(huì)回調(diào)這個(gè)done()方法荷科,我們可以在done()方法中調(diào)用FutureTask的get()方法來獲得計(jì)算的結(jié)果逼蒙。在其他時(shí)候get()會(huì)阻塞我的UI線程辽俗。
局限性:??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? Future:主要是獲取任務(wù)執(zhí)行結(jié)果和對(duì)異步任務(wù)的控制爱葵。1赏殃、但是如果是批量任務(wù)的話奖地,獲取執(zhí)行結(jié)果很麻煩。因?yàn)椴恢滥囊粋€(gè)任務(wù)先完成法竞,得不停的遍歷查詢耙厚。2、也因?yàn)镕uture.get是阻塞方法岔霸,使用不當(dāng)會(huì)造成線程浪費(fèi)薛躬。
解決方法:
1、批量任務(wù)中查詢已完成任務(wù)呆细,可以使用completionService型宝,它提供了一個(gè)take()阻塞方法,用來獲取所有已完成的任務(wù)。
2趴酣、對(duì)于第二個(gè)問題梨树,可以用 Google Guava 庫所提供的 ListeningExecutorService 和 ListenableFuture 來解決。ListenableFuture可以允許注冊(cè)回調(diào)方法(callbacks)岖寞,在運(yùn)算(多線程執(zhí)行)完成的時(shí)候進(jìn)行調(diào)用,? 或者在運(yùn)算(多線程執(zhí)行)完成后立即執(zhí)行抡四。
Future 在高并發(fā)環(huán)境下有可能重復(fù)提交任務(wù)的,所以需要FutureTask阻止這種情況發(fā)生仗谆,保證只會(huì)執(zhí)行一次床嫌。將FutureTask放入map之中,用鍵值對(duì)保存胸私。
FutureTask是一個(gè)RunnableFuture厌处,繼承Runnable、future岁疼,所以FutureTask可以提交給 Executor執(zhí)行也可以由調(diào)用線程直接執(zhí)行FutureTask.run()方法阔涉。FutureTask的run()方法中又會(huì)調(diào)用Callable的call()方法。
那為什么FutureTask還要繼承Runnable呢捷绒?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Callable與Runnable:描述的都是抽象的計(jì)算任務(wù)瑰排。Runnable有局限性,雖然能將結(jié)果寫入日志文件或者某個(gè)方式共享數(shù)據(jù)結(jié)構(gòu)暖侨,但是不能返回一個(gè)值或者拋出異常;Callable是對(duì)Runnable局限性的彌補(bǔ)椭住。
public interface RunnableFuture extends Runnable, Future{
}
private volatile intstate;
private static final intNEW=0;新建
private static final intCOMPLETING=1;執(zhí)行中
private static final intNORMAL=2;正常
private static final intEXCEPTIONAL=3;異常
private static final intCANCELLED=4;取消
private static final intINTERRUPTING=5;中斷中
private static final intINTERRUPTED=6;被中斷
state的狀態(tài)變化可以有四種方式
NEW->COMPLETING->NORMAL?? ??? ??? ??? ??? ??? ??? ?正常完成的流程
NEW->COMPLETING->EXCEPTIONAL?? ??? ??? ??? ?出現(xiàn)異常的流程
NEW->CANCELED?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? ? 被取消
NEW->INTERRUNPING->INTERRRUNPTED?? ??? ?被中斷