@functionalinte***ce
public
inte***ce
callable
可以看到,與runnable介面不同之處在於,call方法帶有泛型返回值v。
常用方法
v get() :獲取非同步執行的結果,如果沒有結果可用,此方法會阻塞直到非同步計算完成。
v get(long timeout , timeunit unit) :獲取非同步執行結果,如果沒有結果可用,此方法會阻塞,但是會有時間限制,如果阻塞時間超過設定的timeout時間,該方法將丟擲異常。
boolean isdone() :如果任務執行結束,無論是正常結束或是中途取消還是發生異常,都返回true。
boolean iscanceller() :如果任務完成前被取消,則返回true。
boolean cancel(boolean mayinterruptrunning) :如果任務還沒開始,執行cancel(…)方法將返回false;如果任務已經啟動,執行cancel(true)方法將以中斷執行此任務執行緒的方式來試圖停止任務,如果停止成功,返回true;當任務已經啟動,執行cancel(false)方法將不會對正在執行的任務執行緒產生影響(讓執行緒正常執行到完成),此時返回false;當任務已經完成,執行cancel(…)方法將返回false。mayinterruptrunning引數表示是否中斷執行中的執行緒。
通過方法分析我們也知道實際上future提供了3種功能:(1)能夠中斷執行中的任務(2)判斷任務是否執行完成(3)獲取任務執行完成後額結果。
我們通過簡單的例子來體會使用callable和future來獲取任務結果的用法。
public
class
threaddemo01
catch
(interruptedexception e)
catch
(executionexception e)
system.out.
println
(integer)
;// 關閉執行緒池
if(executor != null)
executor.
shutdown()
;}}class
addnumbertask
implements
callable
@override
public integer call()
throws exception
}
結果:
main執行緒執行其他任務
####addnumbertask###call()
5000
公共資料介面,futuredata和realdata都要實現。
public
inte***ce
data
futuredata,當有執行緒想要獲取realdata的時候,程式會被阻塞。等到realdata被注入才會使用getrequest()方法。
public
class
fururedata
implements
data
// 如果沒有獲取到資料,傳遞真是物件
this
.realdata = realdata;
isflag =
true
;// 進行通知
notify()
;}@override
public
synchronized string getrequest()
catch
(exception e)
}// 獲取到資料,直接返回
return realdata.
getrequest()
;}}
真實資料realdata
public
class
realdata
implements
data
catch
(exception e)
system.out.
println
("realdata獲取操作完畢,獲取結果...");
result =
"realdate";}
@override
public string getrequest()
}
futureclient 客戶端
public
class
futureclient})
.start()
;return fururedata;
}}
呼叫者:
public
class
main
}
結果:
請求傳送成功!
執行其他任務...
阻塞中返回的是fururedata
正在使用data:請求引數.網路請求資料,耗時操作需要等待.
realdata獲取操作完畢,獲取結果...
獲取到結果.
..realdate
呼叫者請求資源,client.request(「name」); 完成對資料的準備
當要獲取資源的時候,data.getrequest() ,如果資源沒有準備好isflag = false;那麼就會阻塞該執行緒。直到資源獲取然後該執行緒被喚醒。
多執行緒 批量獲取多條執行緒的執行結果
當向執行緒池提交callable任務後,我們可能需要一次性獲取所有返回結果,有三種處理方法。建立乙個執行緒池 executorservice executorservice executors.newfixedthreadpool 10 儲存執行結果的list list results new ar...
獲取執行緒的執行結果
最本質的區別在於,runnable沒有返回結果,callable會有乙個返回結果,返回結果是泛型,可以自己定義。舉例子說明 上述例子中可以看到,callable可以定義乙個返回結果,通過futuretask的get方法可以獲得執行緒執行後的結果 阻塞等待結果 原始碼檢視 allocates a ne...
獲取子執行緒的執行結果
public class thread implements runnable private static class task implements callable public static void main string args throws executionexception,in...