Doug Lea的jsr166y,主要體現在Fork/Join模式,分而治之,然后合并結果,這么一種編程模式。相比JDK 1.6內置的JUC并發框架,更加細粒度。雖然已經內置JDK 1.7中,但本文環境基于JDK 1.6,因此在相關包的引用方面,差異在于包的路徑。
有關Fork/Join的一些摘抄:
fork/join框架是一個“多核友好的、輕量級并行框架 ”,它支持并行編程風格,將問題遞歸拆分成多個更小片斷,以并行和調配的方式解決。Fork-join融合了分而治之技術;獲取問題后,遞歸地將它分成多個子問題,直到每個子問題都足夠小,以至于可以高效地串行地解決它們。遞歸的過程將會把問題分成兩個或者多個子問題,然后把這些問題放入隊列中等待處理(fork步驟),接下來等待所有子問題的結果(join步驟),把多個結果合并到一起。
Doug Lea描述了fork/join框架最可能的使用場景和采用過程:
總之,我期望其使用曲線與其他并發工具雷同。最初,只有較少真正需要的人使用它們,但最終很難找到不依賴于它們的程序,它們常常深埋在底層基礎架構組件中。因此,表面語法支持可能并不是那么重要——類庫/組件開發者越是想合并它們,其用法越是表現的笨拙。
理想的情況下,有幾個使用層次:
1. “并行做事”層次,語言或工具翻譯成并行代碼,同時檢查安全性/活躍性。這仍部分處于研究領域。
2. 安排集合的并行操作。——map、reduce、apply等等。那些想使用一次性操作特性操縱集合的程序員們,可以使用這些特性來提高常用處理類型的速度。(這是ListTasks、ArrayTasks等等層次)
3. 手工生效forkjoin以解決特定問題。這是我正在全力投入的層次,以確保我們可能使用工作竊取框架來支持范圍廣泛的并行算法。(當前一些怪模怪樣的和缺乏解釋的方法,如isQuiescent是為這種高級用法設計的。多數程序只使用“fork”和“join”,但當你需要其他這些方法時,它們也被提供了。)
4. 擴展框架以創建新類型的ForkJoinTasks等等。例如,那些需要事務的操作。只有很少量的人(例如,或許是Fortress運行時類庫開發者)需要這么做,但是需要有足夠的基礎擴展鉤子來才能做好。
本文開始學習,按照心得步驟一步一步進行學習。即將開始。
在相關項目中加入jsr166y.jar依賴即可。
必備條件:JDK 1.6
機器配置:
操作系統 Windows XP 專業版 32位 SP3
處理器 英特爾 Pentium(奔騰) P6200 @ 2.13GHz
內存 4 GB ( 金士頓 DDR3 1333MHz / 三星 DDR3 1333MHz )