在java多線程編程中,我們經(jīng)常使用線程池提交任務(wù),并且通過Future來獲取任務(wù)執(zhí)行的結(jié)果,以此達(dá)到異步或者并行執(zhí)行的效果。在jdk1.7以前,F(xiàn)utureTask是Future唯一的實現(xiàn)類,1.7后加入了ForkJoinTask類。本文主要總結(jié)一下我對FutureTask的理解。
Future類
Future接口定義了5個方法,分別是
boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
分別介紹一下這五個接口的用途:
boolean cancel(boolean mayInterruptInRunning) 取消一個正在執(zhí)行中的任務(wù),并且返回調(diào)用結(jié)果。如果取消成功則返回true,反之返回false。這里要注意,即使方法返回true,當(dāng)前任務(wù)也未必真的被取消了,后面會介紹。
boolean isCancelled() 返回當(dāng)前任務(wù)是否被取消。
Boolean isDone() 返回當(dāng)前任務(wù)是否執(zhí)行完畢。這里done的概念比較廣,包括了futureTask被執(zhí)行后的任意狀態(tài),例如正常執(zhí)行完畢、執(zhí)行異常或者任務(wù)被取消。
V get() 這個接口就是用來獲取futureTask執(zhí)行結(jié)果,調(diào)用這個接口時會被阻塞,直到拿到結(jié)果或者異常。
V get(long timeout, TimeUnit unit) 這個接口多了一個超時時間,如果過了這個時間task仍然沒有結(jié)果返回,則拋出timeout異常