多執行緒中有三個類,分別是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...