7.JUC 三大辅助类
生活随笔
收集整理的這篇文章主要介紹了
7.JUC 三大辅助类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
7.JUC 三大輔助類
?JUC提供了三種常用的輔助類,通過這些輔助類可以很好的解決線程數量過多Lock鎖的頻繁操作。這三種輔助類為:
-
CountDownLatch:減少計數
-
Cyclicbarrier:循環柵欄
-
Semaphore:信號燈
7.1 減少計數CountDownLatch
?CountDownLatch類可以設置一個計數器,然后通過countDown方法來進行減1操作,使用await方法等待計數不大于0,然后繼續執行await方法之后的語句。
- CountDownLatch主要有兩個方法,當一個或多個線程調用await方法時,這些線程會阻塞。
- 其他線程調用countDown方法會將計數器減1(調用countDown方法的線程不會阻塞)。
- 當計數器的值變為0時,因await方法阻塞的線程會被喚醒,繼續執行。
場景:6個同學陸續離開教師后值班同學才可以關門。
/*** CountDownLatch Demo*/ public class CountDownLatchDemo {/*** 6個陸續離開教師之后,班長鎖門*/public static void main(String[] args) throws InterruptedException {// 創建CountDownLathc 對象,設置初始值CountDownLatch countDownLatch = new CountDownLatch(6);// 6個同學陸續離開教室之后for (int i = 0; i < 6; i++) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + "號同學離開教室");// 計數減一countDownLatch.countDown();}, String.valueOf(i)).start();}// 等待countDownLatch.await();System.out.println(Thread.currentThread().getName() + "班長鎖門走人了");} }7.2 循環柵欄CyclicBarrier
CycliBarrier看英文單詞可以看出大概就是循環阻塞的意思,在使用Cyclicbarrier的構造方法第一個參數是目標障礙述,每次執行Cyclicbarrier一次障礙數會加一,如果達到目標障礙數,才會執行cyclicBarrier.await() 之后的語句??梢詫yclicBarrier理解為加1操作。
場景:集齊七顆七龍珠
/*** 集齊七顆龍珠,就可以召喚神龍*/ 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(() -> {try {System.out.println(Thread.currentThread().getName() + "星龍珠被收集到了");// 等待cyclicBarrier.await();} catch (Exception e) {e.printStackTrace();}}, String.valueOf(i)).start();}} }7.3 信號燈Semaphore
?Semaphore 的構造方法中傳入的第一個參數是最大信號量(可以看成最大線程池),每個信號量初始化未一個最多只能分發一個許可證,使用acquire方法獲得許可證,release方法釋放許可。
/*** 6 輛汽車,停3個車位*/ public class SemaphoreDemo {public static void main(String[] args) {// 創建Semaphore,設置許可數量Semaphore semaphore = new Semaphore(3);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 (Exception e) {e.printStackTrace();} finally {// 釋放semaphore.release();}},String.valueOf(i)).start();}} }總結
以上是生活随笔為你收集整理的7.JUC 三大辅助类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: freebsd12 安装gnome3图形
- 下一篇: NetSuite导出CSV文件用Exce