並行方法

總結一下自己常用到的線程池的一些方法:
先看一張結構圖:
轉自:http://www.cnblogs.com/jersey/archive/2011/03/30/2000231.html

這裏寫圖片描述
1、線程池: java.until.current 包提供了現成的線程池的實現。
Executor 接口, ExecutorService Executor 的子接口,它中聲明瞭管理線程池的一些方法,比如用於關閉線程池的shutdown()方法等。
Executors 類中包含了一些靜態的方法,他們負責生成各種類型的線程池:ExecutorService。例如:
這裏寫圖片描述
具體來說呢,就是處理線程池中的線程的策略不同:
(1)、newFixedThreadPool:創建固定大小的線程池。線程池的大小一旦達到最大值就會保持不變,如果某個線程因爲執行異常而結束,那麼線程池會補充一個新線程。
(2)、newCachedThreadPool:創建一個可緩存的線程池。如果線程池的大小超過了處理任務所需要的線程,那麼就會回收部分空閒(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴於操作系統(或者說JVM)能夠創建的最大線程大小。
(3)、newSingleThreadExecutor:創建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當於單線程串行執行所有任務。如果這個唯一的線程因爲異常結束,那麼會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。
(4)、newScheduledThreadPool:創建一個大小無限的線程池。此線程池支持定時以及週期性執行任務的需求。
(5)、newSingleThreadScheduledExecutor:創建一個單線程的線程池。此線程池支持定時以及週期性執行任務的需求。
2、我覺得這個並行策略比較好:ForkJoinPool,實現了工作竊取算法,使得空閒線程能夠主動分擔別的線程分解出來的任務,從而讓所有的線程都處於飽滿的狀態,提高執行的效率。
ForkJoinPool 提供了三類方法來調度子任務:
(1)、exectue系列:異步執行指定的任務;
(2)、invoke和invokeAll 執行指定的任務,等待完成後返回結果。
(3)、submit系列 異步執行指定任務,並立即返回一個Future對象。
子任務由ForkJoinTask 的實例來代表,它是一個抽象類,JDK提供了兩種實現 Recursive Task 和 Recursive Action, 分別用與需要和不需要返回計算結果的任務。兩個接口,callable 和 Runnable ,區別也同樣是在於 會不會返回結果。

對於fork/join框架的理解:
轉自:http://blog.csdn.net/lishehe/article/details/46563785
Fork/Join框架是Java7提供了的一個用於並行執行任務的框架, 是一個把大任務分割成若干個小任務,最終彙總每個小任務結果後得到大任務結果的框架。
我們再通過Fork和Join這兩個單詞來理解下Fork/Join框架,Fork就是把一個大任務切分爲若干子任務並行的執行,Join就是合併這些子任務的執行結果,最後得到這個大任務的結果。比如計算1+2+。。+10000,可以分割成10個子任務,每個子任務分別對1000個數進行求和,最終彙總這10個子任務的結果。Fork/Join的運行流程圖如下:
這裏寫圖片描述
那什麼事工作竊取算法呢:
工作竊取(work-stealing)算法是指某個線程從其他隊列裏竊取任務來執行。工作竊取的運行流程圖如下:
這裏寫圖片描述
那麼爲什麼需要使用工作竊取算法呢?假如我們需要做一個比較大的任務,我們可以把這個任務分割爲若干互不依賴的子任務,爲了減少線程間的競爭,於是把這些子任務分別放到不同的隊列裏,併爲每個隊列創建一個單獨的線程來執行隊列裏的任務,線程和隊列一一對應,比如A線程負責處理A隊列裏的任務。但是有的線程會先把自己隊列裏的任務幹完,而其他線程對應的隊列裏還有任務等待處理。幹完活的線程與其等着,不如去幫其他線程幹活,於是它就去其他線程的隊列裏竊取一個任務來執行。而在這時它們會訪問同一個隊列,所以爲了減少竊取任務線程和被竊取任務線程之間的競爭,通常會使用雙端隊列,被竊取任務線程永遠從雙端隊列的頭部拿任務執行,而竊取任務的線程永遠從雙端隊列的尾部拿任務執行。

工作竊取算法的優點是充分利用線程進行並行計算,並減少了線程間的競爭,其缺點是在某些情況下還是存在競爭,比如雙端隊列裏只有一個任務時。並且消耗了更多的系統資源,比如創建多個線程和多個雙端隊列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章