java併發學習 讀書筆記二

Executor框架介紹

1、Executor框架提供了一個靈活的線程池實現,防止應用程序過載而耗盡內存。它是基於生產者-消費者模式的,提交任務的線程是生產者,執行任務的線程是消費者。

2、線程池
newFixedThreadPool創建一個定長的線程池,每當提交一個任務就創建一個線程,直到達到池的最大長度,這是線程池會保持長度不再變化(如果一個線程由於非預期的Exception而結束,線程池會補充一個新的線程)。
newCachedThreadPool創建一個可緩存的線程池,如果當前線程池的長度超過了處理的需要時,它可以靈活地回收空閒的線程。當需求增加時,它可以靈活的添加新的線程,而並不會對池的長度作任何限制。
newSingleThreadExecutor創建一個單線程化的executor,它只創建唯一的工作者線程來執行任務,如果這個線程異常結束,會有另一個取代它。executor會保證任務依照任務隊列所規定的順序(FIFO,LIFO,優先級)執行。
newScheduledThreadPool創建一個定長的線程池,而且支持定時的以及週期性的任務執行。

3、完成服務CompletionService
CompletionService整合了Executor和BlockingQueue的功能,你可以將Callable任務提交給它去執行,然後使用類似隊列中take和poll方法,在任務結果完整可用時獲得這個結果。

4、SwingUtilities.invokeAndWait,它可以安排一個Runnable任務在事件派發線程中執行,並會阻塞當前線程直到它完成(只能從非GUI線程中調用,否則會發生死鎖)
SwingUtilities.invokeAndLater,它可以安排一個Runnable任務在事件派發線程中執行(可從任意線程中調用)

5、Future是被設計來處理可取消任務,所以遇到任務處理有取消需求時,可以考慮用Future

6、發生死鎖的原因:兩個或者多個線程企圖以不同的順序獲得相同的多個鎖時會發生
例子:
public class LeftRightDeadLock{
private Object left = new Object();
private Object right = new Object();

public void leftRight(){
synchronized(left){
synchronized(right){
doSomething();
}
}
}

public void rightLeft(){
synchronized(right){
synchronized(left){
doSomething();
}
}
}
}


7、Amdahl定律
Amdahl定律描述了在一個系統中,基於可並行化和串行化組件各自所佔的比重,程序通過獲得額外的計算資源,理論上能夠加速多少。如果F是必須串行化執行的比重,N代表處理器數,提速公式爲:
SpeedUp <= 1/ (F + (1 - F)/N)

8、創建Lock/ReentrantLock機制的意義
內部鎖在大部分情況下都能很好的工作,但是有一些功能上的侷限--不能中斷那些等待獲取鎖的線程,並且在請求鎖失敗的情況下只能無限等待。內部鎖必須在獲取它的代碼中釋放;這很好的簡化了代碼,與異常處理機制能夠良好的互動。但在某些情況下,一個更靈活的加鎖機制提供了更好的活躍度和性能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章