八、JUC强大的辅助类
生活随笔
收集整理的這篇文章主要介紹了
八、JUC强大的辅助类
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
八、JUC強大的輔助類
文章目錄
- 八、JUC強大的輔助類
- 1、CountDownLatch減少計數(shù)
- 2、CyclicBarrier循環(huán)柵欄
- 3、Semaphore信號燈
- 更多內(nèi)容:
1、CountDownLatch減少計數(shù)
package com.xue.thread;import java.util.concurrent.CountDownLatch;/*** * @Description:* *讓一些線程阻塞直到另一些線程完成一系列操作后才被喚醒。* * CountDownLatch主要有兩個方法,當(dāng)一個或多個線程調(diào)用await方法時,這些線程會阻塞。* 其它線程調(diào)用countDown方法會將計數(shù)器減1(調(diào)用countDown方法的線程不會阻塞),* 當(dāng)計數(shù)器的值變?yōu)?時,因await方法阻塞的線程會被喚醒,繼續(xù)執(zhí)行。* * 解釋:6個同學(xué)陸續(xù)離開教室后值班同學(xué)才可以關(guān)門。* * main主線程必須要等前面6個線程完成全部工作后,自己才能開干 */ public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException{CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 1; i <=6; i++) //6個上自習(xí)的同學(xué),各自離開教室的時間不一致{new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t 號同學(xué)離開教室");countDownLatch.countDown();}, String.valueOf(i)).start();}countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t****** 班長關(guān)門走人,main線程是班長");} }-
CountDownLatch主要有兩個方法,當(dāng)一個或多個線程調(diào)用await方法時,這些線程會阻塞。
-
其它線程調(diào)用countDown方法會將計數(shù)器減1(調(diào)用countDown方法的線程不會阻塞),
-
當(dāng)計數(shù)器的值變?yōu)?時,因await方法阻塞的線程會被喚醒,繼續(xù)執(zhí)行。
2、CyclicBarrier循環(huán)柵欄
package com.xue.thread;import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;/*** ** CyclicBarrier* 的字面意思是可循環(huán)(Cyclic)使用的屏障(Barrier)。它要做的事情是,* 讓一組線程到達(dá)一個屏障(也可以叫同步點)時被阻塞,* 直到最后一個線程到達(dá)屏障時,屏障才會開門,所有* 被屏障攔截的線程才會繼續(xù)干活。* 線程進(jìn)入屏障通過CyclicBarrier的await()方法。* * 集齊7顆龍珠就可以召喚神龍*/ public class CyclicBarrierDemo {private static final int NUMBER = 7;public static void main(String[] args){//CyclicBarrier(int parties, Runnable barrierAction) CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, ()->{System.out.println("*****集齊7顆龍珠就可以召喚神龍");}) ;for (int i = 1; i <= 7; i++) {new Thread(() -> {try {System.out.println(Thread.currentThread().getName()+"\t 星龍珠被收集 ");cyclicBarrier.await();} catch (InterruptedException | BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}}, String.valueOf(i)).start();}} }-
CyclicBarrier的字面意思是可循環(huán)(Cyclic)使用的屏障(Barrier)。它要做的事情是,
-
讓一組線程到達(dá)一個屏障(也可以叫同步點)時被阻塞,
-
直到最后一個線程到達(dá)屏障時,屏障才會開門,所有
-
被屏障攔截的線程才會繼續(xù)干活。
-
線程進(jìn)入屏障通過CyclicBarrier的await()方法。
3、Semaphore信號燈
package com.xue.thread;import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit;/*** * @Description: TODO(這里用一句話描述這個類的作用) * * 在信號量上我們定義兩種操作:* acquire(獲取) 當(dāng)一個線程調(diào)用acquire操作時,它要么通過成功獲取信號量(信號量減1),* 要么一直等下去,直到有線程釋放信號量,或超時。* release(釋放)實際上會將信號量的值加1,然后喚醒等待的線程。* * 信號量主要用于兩個目的,一個是用于多個共享資源的互斥使用,另一個用于并發(fā)線程數(shù)的控制。*/ public class SemaphoreDemo {public static void main(String[] args){Semaphore semaphore = new Semaphore(3);//模擬3個停車位for (int i = 1; i <=6; i++) //模擬6部汽車{new Thread(() -> {try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t 搶到了車位");TimeUnit.SECONDS.sleep(new Random().nextInt(5));System.out.println(Thread.currentThread().getName()+"\t------- 離開");} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();}}, String.valueOf(i)).start();}} }在信號量上我們定義兩種操作:
- acquire(獲取) 當(dāng)一個線程調(diào)用acquire操作時,它要么通過成功獲取信號量(信號量減1),要么一直等下去,直到有線程釋放信號量,或超時。
- release(釋放)實際上會將信號量的值加1,然后喚醒等待的線程。
- 信號量主要用于兩個目的,一個是用于多個共享資源的互斥使用,另一個用于并發(fā)線程數(shù)的控制。
下一篇:Java內(nèi)存模型之JMM
更多內(nèi)容:
更多內(nèi)容大家可以關(guān)注一下個人博客網(wǎng),https://blog.xueqimiao.com/,內(nèi)容更豐富喔。
回復(fù)JUC可以獲取完整md文檔喔,謝謝關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的八、JUC强大的辅助类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU5128 The E-pang P
- 下一篇: 51单片机 静态数码管显示