執行緒池中的柵欄

2022-03-10 05:23:36 字數 3143 閱讀 2395

多執行緒中有三個類,分別是countdownlatch,cyclicbarrier,semaphore。代表著執行緒中的柵欄。共享鎖。

在一組執行緒中,乙個執行緒等待其他執行緒。我把它理解為門栓。

檢視該類的資料結構圖如下圖一

​ 圖一

有乙個靜態的內部類,sync繼承自aqs。

使用例子:**如下:

/**

* @classname countdownlatchtest

* @description 共享鎖。在完成一組正在其他執行緒中執行的操作之前,允許乙個或者多個執行緒一直等待

* @author ouyangkang

* @date 2018/10/23 14:33

**/public class countdownlatchtest

try ] \n", thread.currentthread().getname());

threadpoolexecutor.shutdown();

} catch (interruptedexception e)

}static class threadtest extends thread catch (interruptedexception e)

system.out.printf("thread-name =[%s] 執行 \n", thread.currentthread().getname());

// 數值減一

countdownlatch.countdown();}}

}

返回結果:

thread-name = [pool-1-thread-1] 

thread-name = [pool-1-thread-3]

thread-name = [pool-1-thread-2]

thread-name =[pool-1-thread-1] 執行

thread-name =[pool-1-thread-3] 執行

thread-name = [pool-1-thread-1]

thread-name = [pool-1-thread-3]

thread-name =[pool-1-thread-2] 執行

thread-name = [pool-1-thread-2]

thread-name =[pool-1-thread-1] 執行

thread-name =[pool-1-thread-3] 執行

thread-name =[pool-1-thread-2] 執行

thread main =

在一組執行緒中允許多個執行緒相互等待。就是,每個執行緒都先執行一下,然後互相等待到乙個點。然後再執行。

檢視該類的資料結構圖

有參構造方法,設定屏障點是多少,建立執行緒,等待。直到執行緒數量大於等於該屏障點。處於該屏障點等待得執行緒全部喚醒。

使用例子如下:

/**

* @classname cyclicbarriertest

* @description 屏障,允許多個執行緒相互等待。到達了某乙個臨界點,就喚醒所有執行緒

* @author ouyangkang

* @date 2018/10/23 15:00

**/public class cyclicbarriertest

}static class threadtest extends thread catch (interruptedexception e) catch (brokenbarrierexception e) }}

}

結果如下:

thread=[thread-0] 開始-- 

thread=[thread-4] 開始--

thread=[thread-3] 開始--

thread=[thread-1] 開始--

thread=[thread-2] 開始--

thread=[thread-2] 繼續---

thread=[thread-4] 繼續---

thread=[thread-0] 繼續---

thread=[thread-1] 繼續---

thread=[thread-3] 繼續---

在一組執行緒中,執行緒持有訊號量,如果資訊量得大小為10,那麼所有執行緒能夠持有得訊號量不能超過10,如果3個執行緒分別持有得訊號量是3 4 5 。 那麼只能是兩個執行緒執行,當其中乙個釋放了該訊號量,其他執行緒才可以執行。

類圖結構如下:

具體例子如下:

/**

* @classname semaphoretest

* @description 訊號量

* @author ouyangkang

* @date 2018/10/23 16:34

**/public class semaphoretest

static class threadtest extends thread

@override

public void run() catch (interruptedexception e) finally }}

}

具體結果如下:

thread=[pool-1-thread-2]  擁有訊號量 semaphore=[4] 開始---- 

thread=[pool-1-thread-1] 擁有訊號量 semaphore=[3] 開始----

thread=[pool-1-thread-2] 釋放了 semaphore=[4] --

thread=[pool-1-thread-2] 擁有訊號量 semaphore=[5] 開始----

thread=[pool-1-thread-1] 釋放了 semaphore=[3] --

thread=[pool-1-thread-2] 釋放了 semaphore=[5] --

執行緒池中的執行緒何時死亡?

runworker this gettask 其他介紹 面試被問到了,結果說的不清楚。回來看了下。檢視從workqueue中gettask,當非core執行緒空閒時間超過keepalivetime,timeunit指定的時間後,則退出 ps 超過空閒時間退出這個我是知道的,但是當時本能的認為不是問的...

執行緒池中如何確定執行緒的數目

我用c寫了乙個執行緒池,但是在寫的時候沒有考慮執行緒池中線程的數目,當初直接隨便設定了乙個執行緒的數目。但是在面試時,將常被問到如何設定執行緒池中線程的數目的?我也在網上了搜了一些資料,今天在這裡就說一下 如何設定執行緒池中線程的數目?執行緒池中線程的數目是跟執行緒池所要處理的任務性質有關的 任務的...

執行緒池中如何確定執行緒的數目

簡單點計算 cpu密集型 cpu 1 io密集型 2 cpu 1 任務依賴性同混合型 針對不同的任務性質而言 cpu密集型任務應配置盡可能小的執行緒,如配置cpu個數 1的執行緒數,io密集型任務應配置盡可能多的執行緒,因為io操作不占用cpu,不要讓cpu閒下來,應加大執行緒數量,如配置兩倍cpu...