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