Future源码解读
Future源碼解讀
- 〇、[源碼版本] jdk 1.8
- 一、Future概述
- [舉例1]示例代碼
- [舉例2]示例代碼
- 內存一致性影響
- 二、Future接口的方法
- cancel方法
- isCancelled方法
- isDone方法
- get方法
〇、[源碼版本] jdk 1.8
一、Future概述
Future表示異步計算的結果。提供了檢查計算是否完成、等待計算完成以及檢索計算結果的方法。
結果只能在計算完成后使用方法get取回,必要時阻塞,直到它準備好。
取消由cancel方法執行。
提供了其他方法來確定任務是正常完成還是被取消。計算一旦完成,就不能取消計算。
如果您想使用Future來實現可取消性,但不提供可用結果,您可以聲明Future<?>形式的類型并返回null作為基礎任務的結果。
[舉例1]示例代碼
interface ArchiveSearcher { String search(String target); }class App {ExecutorService executor = ...ArchiveSearcher searcher = ...void showSearch(final String target) throws InterruptedException {Future<String> future = executor.submit(new Callable<String>() {public String call() {return searcher.search(target);}});displayOtherThings(); // 在處理search的時候,異步處理其他事try {displayText(future.get()); // 使用future} catch (ExecutionException ex) { cleanup(); return; }}}FutureTask類是Future的實現,它實現了Runnable,因此可以由Executor執行。例如,上面帶有submit的構造可以替換為:
[舉例2]示例代碼
FutureTask<String> future = new FutureTask<String>(new Callable<String>() {public String call() {return searcher.search(target);}});executor.execute(future);內存一致性影響
異步計算采取的動作,內存可見性發生在另一個線程中對應Future.get()的操作之前。
二、Future接口的方法
cancel方法
boolean cancel(boolean mayInterruptIfRunning);嘗試取消此任務的執行。
如果任務已完成、已被取消、或由于某些其他原因無法取消,則此嘗試將失敗。
如果成功,并且在調用cancel時此任務尚未啟動,此任務不應運行。
如果任務已經開始,那么mayInterruptIfRunning參數確定執行此任務的線程是否應該在嘗試停止任務時被中斷。
a.參數:
mayInterruptIfRunning 執行此任務的線程是否應該被中斷;否則,允許進行中的任務完成
b.返回:
true 任務取消執行
false 如果任務無法取消,通常是因為它已經正常完成
c.異常:無
isCancelled方法
boolean isCancelled();如果此任務在正常完成之前被取消,則返回true。
a.參數:無
b.返回:
true 如果此任務在正常完成之前被取消
c.異常:無
isDone方法
boolean isDone();如果此任務完成,則返回true。完成可能是由于正常終止、異常或取消——在所有這些情況下,此方法將返回true。
a.參數:無
b.返回:
true 如果此任務完成
c.異常:無
get方法
V get() throws InterruptedException, ExecutionException;如有必要,等待計算完成,然后取回其結果。
a.參數:無
b.返回:
V 計算結果
c.異常:
throws CancellationException 如果計算被取消
throws ExecutionException 如果計算拋出異常
throws InterruptedException 如果當前線程在等待時被中斷
如有必要,最多等待給定的計算時間完成,然后取回其結果(如果可用)。
a.參數:
timeout 最長等待時間
unit 超時參數timeout的時間單位
b.返回:
V 計算結果
c.異常:
throws CancellationException 如果計算被取消
throws ExecutionException 如果計算拋出異常
throws InterruptedException 如果當前線程在等待時被中斷
throws TimeoutException 如果等待超時
總結
以上是生活随笔為你收集整理的Future源码解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java日期用什么属性_java日期以及
- 下一篇: LeetCode——866.回文素数