JUC 三大辅助类
JUC 中提供了三種常用的輔助類,通過這些輔助類可以很好的解決線程數量過
多時 Lock 鎖的頻繁操作。這三種輔助類為:
- CountDownLatch: 減少計數
- CyclicBarrier: 循環柵欄
- Semaphore: 信號燈
文章目錄
- CountDownLatch
- CyclicBarrier
- Semaphore
CountDownLatch
CountDownLatch 類可以設置一個計數器,然后通過 countDown 方法來進行減 1 的操作,使用 await 方法等待計數器不大于 0,然后繼續執行 await 方法之后的語句。
CountDownLatch 主要有兩個方法,當一個或多個線程調用 await 方法時,這些線程會阻塞
其它線程調用 countDown 方法會將計數器減 1(調用 countDown 方法的線程不會阻塞)
當計數器的值變為 0 時,因 await 方法阻塞的線程會被喚醒,繼續執行
場景: 6 個同學陸續離開教室后值班同學才可以關門。
開始代碼測試
控制臺出現的效果并不對,所有同學并沒有走,班長卻鎖門走人了。
加入CountDownLatch類
結果如下,
成功
CyclicBarrier
CyclicBarrier 看英文單詞可以看出大概就是循環阻塞的意思,在使用中CyclicBarrier 的構造方法第一個參數是目標障礙數,每次執行 CyclicBarrier 一次障礙數會加一,如果達到了目標障礙數,才會執行 cyclicBarrier.await()之后的語句。可以將 CyclicBarrier 理解為加 1 操作
場景: 集齊 7 顆龍珠就可以召喚神龍
package com.juc;import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;//集齊 7 顆龍珠就可以召喚神龍 public class CyclicBarrierDemo {//創建固定值private static final int NUMBER = 7;public static void main(String[] args) {//創建CyclicBarrierCyclicBarrier cyclicBarrier = new CyclicBarrier( NUMBER, () ->{System.out.println("******集齊7個七龍珠就可以召喚神龍");} );//集齊七顆龍珠過程for (int i = 1; i <= 7; i++) {new Thread( () ->{System.out.println(Thread.currentThread().getName() + "星龍珠被收集到了");try {cyclicBarrier.await();} catch (Exception e) {e.printStackTrace();}},String.valueOf(i) ).start();}} }控制臺打印如下
上述寫的都是 i <= 7,如果將for循環的 i <= 6 的情況下,程序會進行等待狀態
控制臺展示
END
Semaphore
Semaphore 的構造方法中傳入的第一個參數是最大信號量(可以看成最大線程池),每個信號量初始化為一個最多只能分發一個許可證。使用 acquire 方法獲得許可證,release 方法釋放許可
場景: 搶車位, 6 部汽車 3 個停車位
代碼實現
package com.juc;import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit;//6輛車,3個車位 public class SemaphoreDemo {public static void main(String[] args) {//創建 Semaphore ,設置許可數量 3個車位,3個許可數量Semaphore semaphore = new Semaphore(3);//模擬6輛汽車for (int i = 1; i <= 6 ; i++) {new Thread( () ->{//搶占try {semaphore.acquire();System.out.println(Thread.currentThread().getName() + "---搶到了車位");//設置隨機停車時間TimeUnit.SECONDS.sleep( new Random().nextInt(5));System.out.println(Thread.currentThread().getName() + "------離開了車位");} catch (InterruptedException e) {e.printStackTrace();}finally {//釋放semaphore.release();}},String.valueOf( i )).start();}} }控制臺效果如下
總結
- 上一篇: 郑州大学计算机专业国际学院,郑州大学国际
- 下一篇: windows service and