Java 7的並行支持:Fork/Join

作者 R.J. Lorimer譯者 韓鍇 發佈於 2008年3月23日 下午10時6分

社區
Java
主題
編程,
性能和擴展性,
JCP標準
今天,處理器的內核數量在不斷增加,以什麼樣的方法開發程序才能發揮出新硬件的效能呢?這正變成一個愈發重要的問題擺在了開發者面前。IBM Developerworks已經發布了一篇介紹Fork-Join併發類庫的連載文章,Fork-Join類庫會作爲即將來到的Java 7的一部分進行發佈。InfoQ以前也報道過Java 7中最初的fork/join提案,其中還包含來自最初創建者Doug Lea的反饋。Doug Lea在他的論文“Fork/Join Parallelism in Java”中,首次把fork/join的概念引入到Java中。Doug Lea的util.concurrent包是JSR-166的基礎,後者是發佈在Java 5中的java.util.concurrentl類庫。Fork/Join是對JSR-166的簡單修訂。

連載文章的第一部分詳細介紹了fork-join類庫的核心概念,以及它要解決的問題:
硬件的發展趨勢非常清晰;Moore定律表明不會出現更高的時鐘頻率,但是每個芯片上會集成更多的內核。很容易想象讓十幾個處理器繁忙地處理一個粗粒度的任務邊界(比如一個用戶請求),但是這項技術不會擴大到數千個處理器——在這種環境下短時間內流量可能會呈指數級增長,但最終硬件趨勢將會佔上風。當跨入多內核時代時,我們需要找到更細粒度的並行性,否則將面臨即便有許多工作需要去做而處理器卻仍處於空閒的風險。如果希望跟上技術發展的腳步,軟件平臺也必須配合主流硬件平臺的轉變。最終,Java 7將會包含一種框架,用於表示某種更細粒度級別的並行算法:fork-join框架
第二部分深入探討了在第一部分裏定義的概念,涉及到分而治之(divide-and-conquer)的編程技術:

Fork-join融合了分而治之技術;獲取問題後,遞歸地將它分成多個子問題,直到每個子問題都足夠小,以至於可以高效地串行地解決它們。遞歸的過程將會把問題分成兩個或者多個子問題,然後把這些問題放入隊列中等待處理(fork步驟),接下來等待所有子問題的結果(join步驟),把多個結果合併到一起。

文章接下來展示了一個使用fork/join實現合併排序(merge-sort)算法的示例。

這個連載系列的最後一部分介紹了ParallelArray類。ParallelArray是一個可用於fork/join算法的數據結構,它提供了一個通用目的API,以高度併發的方式執行數據集的搜索、過濾和轉換。

從事Java的BGGA閉包提案的團隊已經採納了fork-join框架與閉包協同工作。他們還在站點上提供了一個可以工作的實現。Developerworks上的那篇連載文章列舉了兩個使用ParallelArray類的例子,它們之間的區別在於是否使用了閉包:

下面的例子是查找一組學生中最好的GPA,它用到了當前Java 7的fork/join提案:

ParallelArray students = new ParallelArray(fjPool, data);
double bestGpa = students.withFilter(isSenior)
.withMapping(selectGpa)
.max();

public class Student {
String name;
int graduationYear;
double gpa;
}

static final Ops.Predicate isSenior = new Ops.Predicate() {
public boolean op(Student s) {
return s.graduationYear == Student.THIS_YEAR;
}
};

static final Ops.ObjectToDouble selectGpa = new Ops.ObjectToDouble() {
public double op(Student student) {
return student.gpa;
}
};
下面的例子與上面的相同,不過使用了BGGA閉包提案:
double bestGpa = students.withFilter({Student s => (s.graduationYear == THIS_YEAR) })
.withMapping({ Student s => s.gpa })
.max();
根據當前的狀況估計,Java 7會在2009年早期發佈。

查看英文鏈接:Parallelism with Fork/Join in Java 7
發佈了1 篇原創文章 · 獲贊 0 · 訪問量 8888
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章