通常我們比較清楚的也比較常見的執行緒實現方式都是一下兩種:
這兩個都有乙個缺點就是在執行完之後無法獲取執行結果,如果非要獲取執行結果,只有通過共享變數或者使用執行緒通訊的方式,但是這樣的話是比較麻煩的。
jdk1.5之後,就提供了callable和future,通過他們可以在任務執行完成之後獲取執行結果。
以下是runnalbe的實現方法:
public inte***ce runnable
顯然runable中只有乙個run方法,並且返回值為void,因此沒法獲取返回值。
再看callable:
public inte***ce callable
可以看到這是乙個泛型介面,call返回的型別就是傳入的v型,callable的使用一般是配合executorservice來使用的,在executorservice中宣告了有若干個submit方法的重載體:
futuresubmit(callabletask);
futuresubmit(runnable task, t result);
future<?> submit(runnable task);
案例介紹:
public class test catch (interruptedexception e1)
system.out.println("主線程在執行任務");
try catch (interruptedexception e) catch (executionexception e)
system.out.println("所有任務執行完畢");
}}class task implements callable
}
先來看看future的原始碼:
public inte***ce future
因為future是乙個介面,無法建立物件,因此就有了futuretask:
public class futuretaskimplements runnablefuture
下面來看看runnablefuture介面的定義:
public inte***ce runnablefutureextends runnable, future
可以看到runnablefuture繼承了runnable和future,因此它既可以作為runnable被執行緒執行,又可以作為callable獲取返回值。
futuretask提供了兩個構造器:
public futuretask(callablecallable)
public futuretask(runnable runnable, v result)
事實上,futuretask也是future唯一的實現類。
案例介紹:
public class test catch (interruptedexception e1)
system.out.println("主線程在執行任務");
try catch (interruptedexception e) catch (executionexception e)
system.out.println("所有任務執行完畢");
}}class task implements callable
}
更多多執行緒併發程式設計可以參考如下技術分享:
《java併發程式設計實戰》筆記(第4章)
十九 設計執行緒安全的類 在設計執行緒安全類的過程中,需要包含以下三個基本要素 1.找出構成物件狀態的所有變數 2.找出約束狀態變數的不變性條件 3.建立物件狀態的併發訪問管理策略。19.1 設計執行緒安全的類 1.類的不變性條件和後驗條件約束了在物件上有哪些狀態和狀態轉換是有效的。2.某些方法還包...
Java併發程式設計實戰筆記 1 執行緒安全簡介
資源利用率 程式在等待操作執行完成的空檔,執行另乙個程式 提高資源利用率。公平性使用者對於計算機的使用權,通過粗粒度的時間分片 使得使用者和程式共享資源程式。便利 效率性 乙個任務分解多個子任務,必要時通訊共同完成任務。非同步事件的簡單處理 對於單執行緒而言,如果要高效處理多個操作,必須使用非阻塞i...
Java併發 JAVA併發程式設計實戰 讀書筆記3
發布乙個物件的意思是使它能夠被當前範圍之外的 所使用。比如將乙個引用儲存到其他 可以訪問的地方,在乙個非私有的方法中返回這個引用。在很多情況下,我們需要確保物件及它們的內部狀態不被暴露。乙個物件在尚未準備好時就將它發布,稱作逸出。最常見的發布物件的方式就是將物件的引用儲存到公共靜態域中,任何類和執行...