多執行緒併發工具類

2021-09-19 16:50:37 字數 1865 閱讀 5508

一、fork-join

什麼是分而治之?

規模為n的問題,n《閾值,直接解決,n>閾值,將n分解為k個小規模子問題,子問題互相對立,與原問題形式相同,將子問題的解合併得到原問題的解。

fork-join使用兩個類來完成以上兩件事情:

forkjointask:我們要使用forkjoin框架,必須首先建立乙個forkjoin任務。它提供在任務中執行fork()和join()操作的機制,通常情況下我們不需要直接繼承forkjointask類,而只需要繼承它的子類,fork/join框架提供了以下兩個子類:

recursiveaction:用於沒有返回結果的任務。

recursivetask :用於有返回結果的任務。

forkjoinpool :forkjointask需要通過forkjoinpool來執行,任務分割出的子任務會新增到當前工作執行緒所維護的雙端佇列中,進入佇列的頭部。當乙個工作執行緒的佇列裡暫時沒有任務時,它會隨機從其他工作執行緒的佇列的尾部獲取乙個任務。

public class finddirsfiles extends recursiveaction

public static void main(string args) catch (exception e)

}//業務方法

@override

protected void compute() else }}

if(!subtasks.isempty())

}} }

}

//單執行緒遞迴讀取某資料夾下的txt檔案

public static void readfile(file file)

if (files != null) else }}

}

二、countdownlatchcountdownlatch是乙個同步輔助類,它作用是讓乙個或多個執行緒等待其他的執行緒完成工作以後再執行,加強版thread.join()。

countdownlatch核心方法:

public class countdownlatchdemo ).start();

}//主線程等所有執行緒完成工作才繼續執行後面的**,當計算器減到0阻塞結束

countdownlatch.await();

long end=system.currenttimemillis();

system.out.println("所有執行緒執行結束,耗時:"+(end-start)+"毫秒");}}

三、cyclicbarriercyclicbarrier 的字面意思是可迴圈使用(cyclic)的屏障(barrier)。它要做的事情是,讓一組執行緒到達乙個屏障(也可以叫同步點)時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開門,所有被屏障攔截的執行緒才會繼續幹活。cyclicbarrier預設的構造方法是cyclicbarrier(int parties),其引數表示屏障攔截的執行緒數量,每個執行緒呼叫await方法告訴cyclicbarrier我已經到達了屏障,然後當前執行緒被阻塞。

public class cyclicbarrierdemo  catch (interruptedexception e)  catch (brokenbarrierexception e) 

}).start();}}

}

countdownlatch和cyclicbarrier區別

多執行緒併發工具類

countdownlatch,cyclicbarrier,semaphore,exchanger countdownlatch,用於乙個或多個執行緒等待其他執行緒完成操作。構造器中的計數值 count 實際上就是閉鎖需要等待的執行緒數量。這個值只能被設定一次,主線程在啟動其他執行緒後立即呼叫coun...

多執行緒 多執行緒之併發工具類

jdk 1.5 後,為我們提供的併發工具類有 名稱描述詳細 countdownlatch同步計數器 初始化時,傳入需要計數的執行緒等待數,並用 await 阻塞當前執行緒,其他執行緒中可以呼叫 countdown 方法讓計數器減一,當計數器為 0 時,則放行 cyclicbarrier柵欄 讓一組執...

多執行緒 併發工具類之CyclicBarrier詳解

從字面意思理解,cyclicbarrier是回環屏障的意思,它可以讓一組執行緒全部達到乙個狀態後再全部同時執行。這裡之所以叫作回環是因為當所有等待執行緒執行完畢,並重置cyclicbarrier 的狀態後它可以被重用。之所以叫作屏障是因為執行緒呼叫await 方法後就會被阻塞,這個阻塞點就稱為屏障點...