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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JUC 三大辅助类

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

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

  • CountDownLatch: 減少計數
  • CyclicBarrier: 循環柵欄
  • Semaphore: 信號燈

文章目錄

  • CountDownLatch
  • CyclicBarrier
  • Semaphore

CountDownLatch

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

CountDownLatch 主要有兩個方法,當一個或多個線程調用 await 方法時,這些線程會阻塞
其它線程調用 countDown 方法會將計數器減 1(調用 countDown 方法的線程不會阻塞)
當計數器的值變為 0 時,因 await 方法阻塞的線程會被喚醒,繼續執行

場景: 6 個同學陸續離開教室后值班同學才可以關門。

開始代碼測試

package com.juc;//演示 CountDownLatch public class CountDownLatchDemo {//6個同學陸續離開教室之后,班長鎖門public static void main(String[] args) {//6個同學陸續離開教室之后for (int i = 1; i <= 6; i++) {new Thread( () ->{System.out.println(Thread.currentThread().getName() +"幾號同學離開了教室");},String.valueOf( i )).start();}System.out.println(Thread.currentThread().getName() +"班長鎖門走人了");} }

控制臺出現的效果并不對,所有同學并沒有走,班長卻鎖門走人了。


加入CountDownLatch類

package com.juc;import java.util.concurrent.CountDownLatch;//演示 CountDownLatch public class CountDownLatchDemo {//6個同學陸續離開教室之后,班長鎖門public static void main(String[] args) throws InterruptedException {//創建CountDownLatchCountDownLatch countDownLatch = new CountDownLatch( 6 );//6個同學陸續離開教室之后for (int i = 1; i <= 6; i++) {new Thread( () ->{System.out.println(Thread.currentThread().getName() +"幾號同學離開了教室");//讓CountDownLatch使用-1操作countDownLatch.countDown();},String.valueOf( i )).start();}//當 -1 操作沒有被計算的時候,進行等待操作countDownLatch.await();System.out.println(Thread.currentThread().getName() +"班長鎖門走人了");} }

結果如下,

成功

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();}} }

控制臺效果如下

總結

以上是生活随笔為你收集整理的JUC 三大辅助类的全部內容,希望文章能夠幫你解決所遇到的問題。

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