ork/join框架是executorservice
介面的一種具體實現,目的是為了幫助你更好地利用多處理器帶來的好處。它是為那些能夠被遞迴地拆解成子任務的工作型別量身設計的。其目的在於能夠使用所有可用的運算能力來提公升你的應用的效能。
類似於executorservice
介面的其他實現,fork/join框架會將任務分發給執行緒池中的工作執行緒。fork/join框架的獨特之處在與它使用工作竊取(work-stealing)演算法。完成自己的工作而處於空閒的工作執行緒能夠從其他仍然處於忙碌(busy)狀態的工作執行緒處竊取等待執行的任務。
fork/join框架的核心是forkjoinpool
類,它是對abstractexecutorservice
類的擴充套件。forkjoinpool
實現了工作偷取演算法,並可以執行forkjointask
任務。
使用fork/join框架的第一步是編寫執行一部分工作的**。你的**結構看起來應該與下面所示的偽**類似:
1
if (當前這個任務工作量足夠小)
2
直接完成這個任務
3
else
4
將這個任務或這部分工作分解成兩個部分
5
分別觸發(invoke)這兩個子任務的執行,並等待結果
你需要將這段**包裹在乙個forkjointask
的子類中。不過,通常情況下會使用一種更為具體的的型別,或者是recursivetask
(會返回乙個結果),或者是recursiveaction
。
當你的forkjointask
子類準備好了,建立乙個代表所有需要完成工作的物件,然後將其作為引數傳遞給乙個forkjoinpool
例項的invoke()
方法即可。
想要了解fork/join框架的基本工作原理,接下來的這個例子會有所幫助。假設你想要模糊一張。原始的source由乙個整數的陣列表示,每個整數表示乙個畫素點的顏色數值。與source相同,模糊之後的destination也由乙個整數陣列表示。
對的模糊操作是通過對source陣列中的每乙個畫素點進行處理完成的。處理的過程是這樣的:將每個畫素點的色值取出,與周圍畫素的色值(紅、黃、藍三個組成部分)放在一起取平均值,得到的結果被放入destination陣列。因為一張會由乙個很大的陣列來表示,這個流程會花費一段較長的時間。如果使用fork/join框架來實現這個模糊演算法,你就能夠借助多處理器系統的並行處理能力。下面是上述演算法結合fork/join框架的一種簡單實現:
01
public
class
forkblur
extends
recursiveaction
16
17
protected
void
computedirectly()
33
34
// reassemble destination pixel.
35
int
dpixel = (
0xff000000
) |
36
(((
int
)rt) <<
16
) |
37
(((
int
)gt) <<
8
) |
38
(((
int
)bt) <<
0
);
39
mdestination[index] = dpixel;
40
}
41
}
接下來你需要實現父類中的compute()
方法,它會直接執行模糊處理,或者將當前的工作拆分成兩個更小的任務。陣列的長度可以作為乙個簡單的閥值來判斷任務是應該直接完成還是應該被拆分。
01
protected
static
int
sthreshold =
100000
;
02
03
protected
void
compute()
08
09
int
split = mlength /
2
;
10
11
invokeall(
new
forkblur(msource, mstart, split, mdestination),
12
new
forkblur(msource, mstart + split, mlength - split,
13
mdestination));
14
}
如果前面這個方法是在乙個recursiveaction
的子類中,那麼設定任務在forkjoinpool
中執行就再直觀不過了。通常會包含以下一些步驟:
建立乙個表示所有需要完成工作的任務。
1
// source image pixels are in src
2
// destination image pixels are in dst
3
forkblur fb =
new
forkblur(src,
0
, src.length, dst);
建立將要用來執行任務的forkjoinpool
。
1
forkjoinpool pool =
new
forkjoinpool();
執行任務。
1
pool.invoke(fb);
想要瀏覽完成的源**,請檢視forkblur
,其中還包含一些建立destination檔案的額外**。
一節。
Oracle官方教程之Fork Join
ork join框架是executorservice介面的一種具體實現,目的是為了幫助你更好地利用多處理器帶來的好處。它是為那些能夠被遞迴地拆解成子任務的工作型別量身設計的。其目的在於能夠使用所有可用的運算能力來提公升你的應用的效能。類似於executorservice介面的其他實現,fork jo...
Oracle官方併發教程之活躍度
乙個併發應用程式能及時執行的能力稱為活躍性。本節將介紹最常見的活躍性問題 死鎖 deadlock 以及另外兩個活躍性問題 飢餓 starvation 和活鎖 livelock 死鎖描述了這樣一種情景,兩個或多個執行緒永久阻塞,互相等待對方釋放資源。下面是乙個例子。alphone和gaston是朋友,...
Firefly官方教程之DBentrust使用文件
1 dbentrust說明 該模組主要是對資料庫與memcached儲存的處理。裡面封裝了從memcached資料到python物件的對映。可以以操縱python物件的方式進行memcached中儲存的資料的操作,只要在不同的程序中例項化相同名稱的memobject物件,就能保證物件中的資料是一致的...