Java CountDownLatch與CyclicBarrier及Semaphore使用教程
CountDownLatch
CountDownLatch是一個倒數(shù)的計數(shù)器閥門,初始化時閥門關閉,指定計數(shù)的數(shù)量,當數(shù)量倒數(shù)減到0時閥門打開,被阻塞線程被喚醒。
public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { // 總數(shù)是6,必須要執(zhí)行任務的時候,再使用 ! CountDownLatch countDownLatch = new CountDownLatch(6); for (int i = 1; i <=6 ; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+" Go out"); countDownLatch.countDown(); // 數(shù)量-1 },String.valueOf(i)).start(); } countDownLatch.await(); // 等待計數(shù)器歸零,然后再向下執(zhí)行 System.out.println("Close Door"); } }
原理
countDownLatch.countDown();//數(shù)量-1
countDownLatch.await();//等待
每次有線程調用 countDown() 數(shù)量-1,假設計數(shù)器變?yōu)?,countDownLatch.await() 就會被喚醒,繼續(xù)執(zhí)行!
CyclicBarrier
CyclicBarrier是一個可循環(huán)的屏障,它允許多個線程在執(zhí)行完相應的操作后彼此等待共同到達一個point,等所有線程都到達后再繼續(xù)執(zhí)行。
CyclicBarrier也可以像CountDownLatch一樣適用于多個子任務并發(fā)執(zhí)行,當所有子任務都執(zhí)行完后再繼續(xù)接下來的工作。
public class CyclicBarrierDemo { public static void main(String[] args) { // 召喚龍珠的線程 CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{ System.out.println("召喚神龍成功!"); }); for (int i = 1; i <=7 ; i++) { final int temp = i; // lambda能操作到 i 嗎 new Thread(()->{ System.out.println(Thread.currentThread().getName()+"收集"+temp+"個龍珠"); try { cyclicBarrier.await(); // 等待 } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }).start(); } } }
Semaphore
Semaphore翻譯過來是信號量的意思,它的作用是控制多個線程對同一個資源的訪問線程數(shù)量。比如在停車場停車,里面有10個車位,當這10個車位被停滿的時候其他的車只能等待(堵塞)里面有車駛出(release)然后再進入。
public class SemaphoreDemo { public static void main(String[] args) { // 線程數(shù)量:停車位! 限流! Semaphore semaphore = new Semaphore(3); for (int i = 1; i <=6 ; i++) { new Thread(()->{ // acquire() 得到 try { semaphore.acquire(); System.out.println(Thread.currentThread().getName()+"搶到車位"); TimeUnit.SECONDS.sleep(2); System.out.println(Thread.currentThread().getName()+"離開車位"); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); // release() 釋放 } },String.valueOf(i)).start(); } } }
semaphore.acquire();
獲得,假設如果已經滿了,等待,等待被釋放為止!
semaphore.release();
釋放,會將當前的信號量釋放 + 1,然后喚醒等待的線程!
作用: 多個共享資源互斥的使用!并發(fā)限流,控制最大的線程數(shù)!
到此這篇關于Java CountDownLatch與CyclicBarrier及Semaphore使用教程的文章就介紹到這了,更多相關Java CountDownLatch內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java并發(fā)編程之CountDownLatch的使用
CountDownLatch是一個倒數(shù)的同步器,常用來讓一個線程等待其他N個線程執(zhí)行完成再繼續(xù)向下執(zhí)行,本文主要介紹了CountDownLatch的具體使用方法,感興趣的可以了解一下2023-05-05springboot動態(tài)定時任務的實現(xiàn)方法示例
這篇文章主要給大家介紹了關于springboot動態(tài)定時任務的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02