日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JUC- 常用的辅助类

發布時間:2023/12/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JUC- 常用的辅助类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

常用的輔助類

JUC 中提供了三種常用的輔助類,通過這些輔助類可以很好的解決線程數量過多時 Lock 鎖的頻繁操作。這三種輔助類為:

  • CountDownLatch: 減少計數(減 1 操作)
  • CyclicBarrier: 循環柵欄(加 1 操作)
  • Semaphore: 信號燈(許可證)

CountDownLatch

減少計數:
CountDownLatch 類可以設置一個計數器,
然后通過 countDown 方法來進行 減 1 的操作,
使用 await 方法等待計數器不大于 0,
然后繼續執行 await 方法之后的語句。

? CountDownLatch 主要有兩個方法,當一個或多個線程調用 await 方法時,這些線程會阻塞 ? 其它線程調用 countDown 方法會將計數器減 1(調用 countDown 方法的線程 不會阻塞) ? 當計數器的值變為 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- 常用的辅助类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。