JUC- 常用的辅助类
生活随笔
收集整理的這篇文章主要介紹了
JUC- 常用的辅助类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
常用的輔助類
JUC 中提供了三種常用的輔助類,通過這些輔助類可以很好的解決線程數量過多時 Lock 鎖的頻繁操作。這三種輔助類為:
- CountDownLatch: 減少計數(減 1 操作)
- CyclicBarrier: 循環柵欄(加 1 操作)
- Semaphore: 信號燈(許可證)
CountDownLatch
減少計數:
CountDownLatch 類可以設置一個計數器,
然后通過 countDown 方法來進行 減 1 的操作,
使用 await 方法等待計數器不大于 0,
然后繼續執行 await 方法之后的語句。
場景: 6 個同學陸續離開教室后值班同學才可以關門。
CountDownLatchDemo
package com.atguigu.test; import java.util.concurrent.CountDownLatch; /*** CountDownLatchDemo*/ public class CountDownLatchDemo {/*** 6 個同學陸續離開教室后值班同學才可以關門 * @param args*/public static void main(String[] args) throws Exception{//定義一個數值為 6 的計數器CountDownLatch countDownLatch = new CountDownLatch(6);//創建 6 個同學for (int i = 1; i <= 6; i++) {new Thread(() ->{try{if(Thread.currentThread().getName().equals("同學 6")){Thread.sleep(2000);}System.out.println(Thread.currentThread().getName() + "離開了");//計數器減一,不會阻塞countDownLatch.countDown();}catch (Exception e){e.printStackTrace();}}, "同學" + i).start();}//主線程 await 休息System.out.println("主線程睡覺");countDownLatch.await();//全部離開后自動喚醒主線程System.out.println("全部離開了,現在的計數器為" + countDownLatch.getCount());} }循環柵欄 CyclicBarrier
CyclicBarrier 看英文單詞可以看出大概就是循環阻塞的意思。
在使用中 CyclicBarrier 的構造方法第一個參數是目標障礙數,
每次執行 CyclicBarrier 一次障礙數會加一,
如果達到了目標障礙數,才會執行 cyclicBarrier.await()之后的語句。
可以將 CyclicBarrier 理解為加 1 操作
場景: 集齊 7 顆龍珠就可以召喚神龍
CyclicBarrierDemo
package com.atguigu.test; import java.util.concurrent.CyclicBarrier; /*** CyclicBarrierDemo 案列*/ public class CyclicBarrierDemo {//定義神龍召喚需要的龍珠總數private final static int NUMBER = 7;/*** 集齊 7 顆龍珠就可以召喚神龍 * @param args*/public static void main(String[] args) {//定義循環柵欄CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, () ->{System.out.println("集齊" + NUMBER + "顆龍珠,現在召喚神龍!!!!!!!!!");});//定義 7 個線程分別去收集龍珠for (int i = 1; i <= 7; i++) {new Thread(()->{try {if(Thread.currentThread().getName().equals("龍珠 3 號")){System.out.println("龍珠 3 號搶奪戰開始,孫悟空開啟超級賽亞人模式!");Thread.sleep(5000);System.out.println("龍珠 3 號搶奪戰結束,孫悟空打贏了,拿到了龍珠 3號!");}else{System.out.println(Thread.currentThread().getName() + "收集到了!!!!");}cyclicBarrier.await();}catch (Exception e){e.printStackTrace();}}, "龍珠" + i + "號").start();}} }信號燈 Semaphore
Semaphore 的構造方法中傳入的第一個參數是最大信號量(可以看成最大線程池),每個信號量初始化為一個最多只能分發一個許可證。
使用 acquire 方法獲得許可證,release 方法釋放許可證
場景: 搶車位, 6 部汽車 3 個停車位
SemaphoreDemo
package com.atguigu.test; import java.util.concurrent.Semaphore; /*** Semaphore 案列*/ public class SemaphoreDemo {/*** 搶車位, 10 部汽車 1 個停車位 * @param args*/public static void main(String[] args) throws Exception{//定義 3 個停車位Semaphore semaphore = new Semaphore(1);//模擬 6 輛汽車停車for (int i = 1; i <= 10; i++) {Thread.sleep(100);//停車new Thread(() ->{try {System.out.println(Thread.currentThread().getName() + "找車位 ing");semaphore.acquire();System.out.println(Thread.currentThread().getName() + "汽車停車成功!");Thread.sleep(10000);}catch (Exception e){e.printStackTrace();}finally {System.out.println(Thread.currentThread().getName() + "溜了溜了");semaphore.release();}}, "汽車" + i).start();}} }總結
以上是生活随笔為你收集整理的JUC- 常用的辅助类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能不止联络,容联助力银行以服务创造价值
- 下一篇: 软路由虚拟服务器,VMware虚拟机安装