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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JUC的常用辅助工具

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

CountDownLatch(減少計數)

原理:

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

?代碼:?題目:6個學生+班長在教室上自習,只有班長有鑰匙鎖門,班長只有等六個學生都走完才能鎖門

package com.thekingqj;import java.util.concurrent.CountDownLatch;/*** CountDownLatch主要有兩個方法,當一個或多個線程調用await方法時,這些線程會阻塞。* 其它線程調用countDown方法會將計數器減1(調用countDown方法的線程不會阻塞),* 當計數器的值變為0時,因await方法阻塞的線程會被喚醒,繼續執行。* */ public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 0; i <6 ; i++) {final int temp=i;new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t"+temp+"離開教室");countDownLatch.countDown();}, String.valueOf(i)).start();}countDownLatch.await();System.out.println("班長離開教室");} }

CyclicBarrier循環柵欄

原理:

字面意思是可循環(Cyclic)使用的屏障(Barrier)。它要做的事情是,
? 讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,
? 直到最后一個線程到達屏障時,屏障才會開門,所有
? 被屏障攔截的線程才會繼續干活。
? 線程進入屏障通過CyclicBarrier的await()方法。

樣例:集齊七顆龍珠才能召喚神龍

package com.thekingqj;import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;/*** * CyclicBarrier* * 的字面意思是可循環(Cyclic)使用的屏障(Barrier)。它要做的事情是,* * 讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,* * 直到最后一個線程到達屏障時,屏障才會開門,所有* * 被屏障攔截的線程才會繼續干活。* * 線程進入屏障通過CyclicBarrier的await()方法*/ public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier barrier = new CyclicBarrier(7, () -> {System.out.println("*******召喚神龍");});for (int i = 1; i <=7 ; i++) {final int temp=i;new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t第"+temp+"個龍珠已經收集到");try {barrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}, String.valueOf(i)).start();}} }

Semaphore信號燈

原理:

?在信號量上我們定義兩種操作:
? acquire(獲取) 當一個線程調用acquire操作時,它要么通過成功獲取信號量(信號量減1),
??????? 要么一直等下去,直到有線程釋放信號量,或超時。
? release(釋放)實際上會將信號量的值加1,然后喚醒等待的線程。
? 信號量主要用于兩個目的,一個是用于多個共享資源的互斥使用,另一個用于并發線程數的控制。

非公平鎖,意思就是可以耍流氓,誰搶到的算誰的。

代碼:六部車搶三個車位

package com.thekingqj;import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit;public class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore=new Semaphore(3);for (int i = 0; i <6 ; i++) {new Thread(() -> {boolean flag=false;try {semaphore.acquire();//獲取信號量flag=true;System.out.println(Thread.currentThread().getName()+"\t"+"搶到車位");TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+"\t"+"離開車位");} catch (InterruptedException e) {e.printStackTrace();}finally {if(flag){semaphore.release();//釋放當前信號量}}}, String.valueOf(i)).start();}} }

?

?

?

?

?

?

?

?

?

總結

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

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