1 fork/join介紹
forkjoin是實現多執行緒"分而治之"思想的框架,將乙個大任務分成多個乙個個小任務,然後對每個小任務執行平行計算,最後將結果合併起來。
1.2 fork/join使用
在使用方面必須首先建立乙個forkjoin 任務。它提供在任務中執行fork 和join 的操作機制,通常不直接繼承forkjointask 類,只需要直接繼承其子類。
// 繼承recursiveaction的方式,不用返回值的方式
public
class
finddirsfiles
extends
recursiveaction
@override
protected
void
compute()
else}}
if(!subtasks.
isempty()
)}}}
public
static
void
main
(string [
] args)
system.out.
println
("main thread done sth......,otherwork="
+otherwork)
;// 阻塞方法,
task.
join()
; system.out.
println
("task end");
}catch
(exception e)
}
// 繼承recursivetask有返回值
public
class
myrecursivetask
extends
recursivetask
@override
protected integer compute()
return sum;
}else
}}
public
static
void
main
(string[
] args)
2. countdownlatch
2.1 countdownlatch是什麼?
countdownlatch這個類使乙個執行緒等待其他執行緒各自執行完畢後再執行。
它是通過乙個計數器來實現的,計數器的初始值是執行緒的數量。每當乙個執行緒執行完畢後,計數器的值就-1,當計數器的值為0時,表示所有執行緒都執行完畢,然後在閉鎖上等待的執行緒就可以恢復工作了。
如圖所示,乙個程式初始化需要五步,那就初始化countdownlatch為5,每個執行緒初始化結束就對其進行"減一"操作,直到值減為零之後,等待執行緒被喚醒,繼續執行主流程**。
2.2 countdownlatch使用場景
2.3 使用案例
public
class
usecountdownlatch}}
private
static
class
busithread
implements
runnable
catch
(interruptedexception e)
for(
int i =
0; i <
3; i++)}
}public
static
void
main
(string[
] args)
throws interruptedexception })
.start()
;new
thread
(new
busithread()
).start()
;for
(int i =
0; i <
3; i++
)// 多少時間之後,沒有執行就不阻塞,繼續執行下去
latch.
await(10
, timeunit.nanoseconds)
; system.out.
println
("main do ites work........");
}}
測試用例**見: [email protected]:oujie123/understandingofthread.gi 多執行緒併發工具類
一 fork join 什麼是分而治之?規模為n的問題,n 閾值,直接解決,n 閾值,將n分解為k個小規模子問題,子問題互相對立,與原問題形式相同,將子問題的解合併得到原問題的解。fork join使用兩個類來完成以上兩件事情 forkjointask 我們要使用forkjoin框架,必須首先建立乙...
多執行緒併發工具類
countdownlatch,cyclicbarrier,semaphore,exchanger countdownlatch,用於乙個或多個執行緒等待其他執行緒完成操作。構造器中的計數值 count 實際上就是閉鎖需要等待的執行緒數量。這個值只能被設定一次,主線程在啟動其他執行緒後立即呼叫coun...
多執行緒 多執行緒之併發工具類
jdk 1.5 後,為我們提供的併發工具類有 名稱描述詳細 countdownlatch同步計數器 初始化時,傳入需要計數的執行緒等待數,並用 await 阻塞當前執行緒,其他執行緒中可以呼叫 countdown 方法讓計數器減一,當計數器為 0 時,則放行 cyclicbarrier柵欄 讓一組執...