在java多線程編程中,我們經(jīng)常使用線程池提交任務(wù),并且通過(guò)Future來(lái)獲取任務(wù)執(zhí)行的結(jié)果,以此達(dá)到異步或者并行執(zhí)行的效果。在jdk1.7以前,F(xiàn)utureTask是Future唯一的實(shí)現(xiàn)類(lèi),1.7后加入了ForkJoinTask類(lèi)。本文主要總結(jié)一下我對(duì)FutureTask的理解。

Future類(lèi)

  Future接口定義了5個(gè)方法,分別是 

 boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); 
 boolean isDone(); 
 V get() throws InterruptedException, ExecutionException; 
 V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

    分別介紹一下這五個(gè)接口的用途:

  • boolean cancel(boolean mayInterruptInRunning) 取消一個(gè)正在執(zhí)行中的任務(wù),并且返回調(diào)用結(jié)果。如果取消成功則返回true,反之返回false。這里要注意,即使方法返回true,當(dāng)前任務(wù)也未必真的被取消了,后面會(huì)介紹。

  • boolean isCancelled() 返回當(dāng)前任務(wù)是否被取消。

  • Boolean isDone() 返回當(dāng)前任務(wù)是否執(zhí)行完畢。這里done的概念比較廣,包括了futureTask被執(zhí)行后的任意狀態(tài),例如正常執(zhí)行完畢、執(zhí)行異?;蛘呷蝿?wù)被取消。

  • V get() 這個(gè)接口就是用來(lái)獲取futureTask執(zhí)行結(jié)果,調(diào)用這個(gè)接口時(shí)會(huì)被阻塞,直到拿到結(jié)果或者異常。

  • V get(long timeout, TimeUnit unit) 這個(gè)接口多了一個(gè)超時(shí)時(shí)間,如果過(guò)了這個(gè)時(shí)間task仍然沒(méi)有結(jié)果返回,則拋出timeout異常

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式