多執行緒學習(二)CountDownLunch與CyclicBarrier
兩個看上去有點像的類,都在java.util.concurrent下,都可以用來表示程式碼執行到某個點上,二者的區別在於:
(1)CyclicBarrier的某個執行緒執行到某個點上之後,該執行緒即停止執行,直到所有的執行緒都到達了這個點,所有執行緒才重新執行;CountDownLatch則不是,某執行緒執行到某個點上之後,只是給某個數值-1而已,該執行緒繼續執行
(2)CyclicBarrier只能喚起一個任務,CountDownLatch可以喚起多個任務
(3)CyclicBarrier可重用,CountDownLatch不可重用,計數值為0該CountDownLatch就不可再用了
CyclicBarrier
public class CyclicBarrierTest {
/**
* 工作執行緒
*/
private static class Work implements Runnable{
private CyclicBarrier cyclicBarrier ;
public Work(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
//只有所有人都完成第一階段才能開始第二階段
public void run() {
firstwork();
try {
//等待完成第一階段工作
cyclicBarrier.await();
secondWork();
//完成第二階段工作
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
//work1
private void firstwork(){
System.out.println(Thread.currentThread().getName()+"完成第一項工作");
}
//work2
private void secondWork(){
System.out.println(Thread.currentThread().getName()+"完成第二階段");
}
};
//通知執行緒
private static class NoticeThread implements Runnable{
boolean [] flag = new boolean[2] ;
public void run() {
if (!flag[0]){
System.out.println("通知:第一階段完成");
flag[0] = true;
}else
if( !flag[1]){
System.out.println("通知:第二階段完成");
}
}
}
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(10,new NoticeThread());
for (int i =0 ;i<10 ;i++){
new Thread(new Work(cyclicBarrier)).start();
}
}
}
結果
Thread-0完成第一項工作
Thread-2完成第一項工作
Thread-1完成第一項工作
Thread-4完成第一項工作
Thread-3完成第一項工作
Thread-7完成第一項工作
Thread-8完成第一項工作
Thread-6完成第一項工作
Thread-5完成第一項工作
Thread-9完成第一項工作
通知:第一階段完成
Thread-9完成第二階段
Thread-0完成第二階段
Thread-2完成第二階段
Thread-1完成第二階段
Thread-4完成第二階段
Thread-3完成第二階段
Thread-7完成第二階段
Thread-8完成第二階段
Thread-6完成第二階段
Thread-5完成第二階段
通知:第二階段完成
從結果看到 cyclicBarrier 阻塞所有執行緒, 之後 都到達後 ,會喚醒一個通知執行緒, 之後所有阻塞的工作執行緒繼續執行, 都到達第二階段 之後喚醒 通知執行緒,再繼續. 並且一個 cyclicBarrier可以重複利用.
CountDownLunch
public class CountDownLunchTest {
private CountDownLatch countDownLatch = new CountDownLatch(5);
public void doWork(){
countDownLatch.countDown();
System.out.println(countDownLatch.getCount());
}
public static void main(String[] args) throws InterruptedException {
final CountDownLunchTest test = new CountDownLunchTest();
Runnable runnable = new Runnable() {
public void run() {
test.doWork();
}
};
for (int i = 0; i <5; i++) {
new Thread(runnable).start();
}
test.countDownLatch.await();
System.out.println("end");
}
}
其他參考:https://github.com/wowdouble/wowdouble/tree/master/threaddemo
相關文章
- 多執行緒學習(二)執行緒
- Java 多執行緒基礎 - CyclicBarrierJava執行緒
- java多執行緒系列:通過對戰遊戲學習CyclicBarrierJava執行緒遊戲
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- Java多執行緒學習(八)執行緒池與Executor 框架Java執行緒框架
- 多執行緒學習一(多執行緒基礎)執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- C#多執行緒學習(二) 如何操縱一個執行緒C#執行緒
- Java多執行緒同步工具類之CyclicBarrierJava執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- Java多執行緒學習——執行緒通訊Java執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- iOS 多執行緒-學習iOS執行緒
- Java多執行緒學習Java執行緒
- 多執行緒學習一執行緒
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- 執行緒與多執行緒執行緒
- 多執行緒(二)執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Java 多執行緒NIO學習Java執行緒
- C++多執行緒學習C++執行緒
- python 多程式和多執行緒學習Python執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- Python學習筆記 - 多執行緒Python筆記執行緒
- Java 多執行緒學習筆記Java執行緒筆記
- 多執行緒學習-Disruptor佇列執行緒佇列
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- 多執行緒基礎必要知識點!看了學習多執行緒事半功倍執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 執行緒屏障CyclicBarrier實現原理執行緒
- 多執行緒複習執行緒
- 多執行緒筆記 二執行緒筆記
- Java多執行緒學習筆記(自用)Java執行緒筆記
- java多執行緒10:併發工具類CountDownLatch、CyclicBarrier和SemaphoreJava執行緒CountDownLatch
- GIL與多執行緒執行緒