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