JUC併發程式設計之Semaphore、CountDownLatch、CyclicBarrier協同工具
Semaphore是一個計數訊號量,常用於限制可以訪問某些資源的執行緒數量,即一種用來控制併發量的共享鎖。
CountDownLatch是一個倒計數器,起跑訊號。
CyclicBarrier是一個迴圈柵欄,排隊摩天輪。
程式碼示例:
下面分別是三種併發協同工具的使用測試
public class SemaphoreDemo {
static Semaphore sp = new Semaphore(6);
// static KaneSemaphore sp = new KaneSemaphore(6);
public static void main(String[] args) {
for (int i = 0; i < 12; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
sp.acquire();//獲取訊號量
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("當前訊號量限制...");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("執行完了");
sp.release();
}
}).start();
}
}
}
執行結果:
當前訊號量限制...
當前訊號量限制...
當前訊號量限制...
當前訊號量限制...
當前訊號量限制...
當前訊號量限制...
執行完了
當前訊號量限制...
執行完了
執行完了
執行完了
當前訊號量限制...
當前訊號量限制...
當前訊號量限制...
執行完了
執行完了
當前訊號量限制...
當前訊號量限制...
執行完了
執行完了
執行完了
執行完了
執行完了
執行完了
6個6個執行
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(6);
// KaneCountDownLatch latch = new KaneCountDownLatch(6);
//一種方式
for (int i = 0; i < 6; i++) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("開始準備...");
latch.countDown();//計數減一
}
}).start();
Thread.sleep(1000L);
}
latch.await();//每個執行緒執行一次則-1,當lache為0時開始向下執行,就是這些現場都準備就緒,然後一起去幹同一件事
// //另一種方式
// for (int i = 0; i < 6; i++) {
// new Thread(new Runnable() {
// @Override
// public void run() {
// latch.countDown();
// try {
// latch.await();
// System.out.println("執行緒:" + Thread.currentThread().getName() + "執行完畢");
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }).start();
// }
System.out.println("開始幹活...");
}
}
執行結果
開始準備...
開始準備...
開始準備...
開始準備...
開始準備...
開始準備...
開始幹活...
public class CyclicBarrierDemo {
public static void main(String[] args) throws InterruptedException {
CyclicBarrier barrier = new CyclicBarrier(4);
// KaneCyclicBarrier barrier = new KaneCyclicBarrier(4);
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
// barrier.await();
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("任務開始執行");
}
}).start();
Thread.sleep(500L);
}
}
}
執行結果
任務開始執行
任務開始執行
任務開始執行
任務開始執行
任務開始執行
任務開始執行
任務開始執行
任務開始執行
任務開始執行
任務開始執行
任務開始執行
任務開始執行
...
4個4個執行
相關文章
- Java併發程式設計:CountDownLatch、CyclicBarrier和SemaphoreJava程式設計CountDownLatch
- Java併發之CountDownLatch、CyclicBarrier和SemaphoreJavaCountDownLatch
- Java 併發工具類 CountDownLatch、CyclicBarrier、Semaphore、ExchangerJavaCountDownLatch
- 突擊併發程式設計JUC系列-併發工具 Semaphore程式設計
- 07 併發工具類CountDownLatch、CyclicBarrier、Semaphore使用及原始碼分析CountDownLatch原始碼
- 併發-6-wait、notify、Semaphore、CountDownLatch、CyclicBarrierAICountDownLatch
- java多執行緒10:併發工具類CountDownLatch、CyclicBarrier和SemaphoreJava執行緒CountDownLatch
- JUC併發系列(八):併發程式設計常用輔助類CountDownLatch與CyclicBarrier(手敲程式碼示例)程式設計CountDownLatch
- 併發程式設計之:JUC併發控制工具程式設計
- Java 併發包之CountDownLatch、CyclicBarrierJavaCountDownLatch
- 【高併發】AQS中的CountDownLatch、Semaphore與CyclicBarrier用法總結AQSCountDownLatch
- 併發程式設計之:CountDownLatch程式設計CountDownLatch
- 高併發之ReentrantLock、CountDownLatch、CyclicBarrierReentrantLockCountDownLatch
- Java併發包5--同步工具CountDownLatch、CyclicBarrier、Semaphore的實現原理解析JavaCountDownLatch
- JUC(3)---CountDownLatch、CyclicBarrier和AQSCountDownLatchAQS
- 併發模擬-程式碼CountDownLatch,SemaphoreCountDownLatch
- Java併發—— CountDownLatch與CyclicBarrierJavaCountDownLatch
- CyclicBarrier、CountDownLatch與Semaphore的小記CountDownLatch
- 大白話說java併發工具類-CountDownLatch,CyclicBarrierJavaCountDownLatch
- CountDownLatch、CyclicBarrier、Semaphore、Exchanger 的詳細解析CountDownLatch
- CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析CountDownLatch
- 併發程式設計之 CyclicBarrier 原始碼分析程式設計原始碼
- 面試官:說說CountDownLatch,CyclicBarrier,Semaphore的原理?面試CountDownLatch
- java併發程式設計JUC第九篇:CountDownLatch執行緒同步Java程式設計CountDownLatch執行緒
- Java併發程式設計之CyclicBarrier使用指南Java程式設計
- Java併發(6)- CountDownLatch、Semaphore與AQSJavaCountDownLatchAQS
- java併發程式設計JUC第十篇:CyclicBarrier執行緒同步Java程式設計執行緒
- Java併發程式設計序列之JUC底層AQSJava程式設計AQS
- 併發程式設計之 執行緒協作工具類程式設計執行緒
- Java併發程式設計序列之JUC底層AQS(二)Java程式設計AQS
- CyclicBarrier And CountDownLatchCountDownLatch
- 併發工具類——Semaphore
- Java 併發程式設計(十四) -- CyclicBarrier原始碼分析Java程式設計原始碼
- JUC併發程式設計基石AQS原始碼之結構篇程式設計AQS原始碼
- java併發程式設計工具類JUC第八篇:ConcurrentHashMapJava程式設計HashMap
- java併發程式設計工具類JUC第二篇:ArrayBlockingQueueJava程式設計BloC
- Java 併發程式設計(十三) -- CountDownLatch原始碼分析Java程式設計CountDownLatch原始碼
- Java併發程式設計實戰--閉鎖 CountDownLatchJava程式設計CountDownLatch