国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - CyclicBarrier:人齊了,老司機就發車了!

CyclicBarrier:人齊了,老司機就發車了!

2021-04-09 23:20Java中文社群磊哥 Java教程

CyclicBarrier 翻譯為中文是循環(Cyclic)柵欄(Barrier)的意思,它的大概含義是實現一個可循環利用的屏障。

CyclicBarrier:人齊了,老司機就發車了!

上一篇咱講了 CountDownLatch 可以解決多個線程同步的問題,相比于 join 來說它的應用范圍更廣,不僅可以應用在線程上,還可以應用在線程池上。然而 CountDownLatch 卻是一次性的計數器,以王者農藥來說,咱們不可能一場團戰就決定比賽的輸贏,所以在某些場景下,咱們是需要重復使用某個等待功能的,這就是我們今天要介紹的另一個主角——CyclicBarrier

CyclicBarrier

 

CyclicBarrier 翻譯為中文是循環(Cyclic)柵欄(Barrier)的意思,它的大概含義是實現一個可循環利用的屏障。

CyclicBarrier:人齊了,老司機就發車了!

CyclicBarrier 作用是讓一組線程相互等待,當達到一個共同點時,所有之前等待的線程再繼續執行,且 CyclicBarrier 功能可重復使用。CyclicBarrier:人齊了,老司機就發車了!

舉個栗子

比如磊哥要坐班車回老家,因為中途不允許上、下乘客,所以營運的公司為了收益最大化,就會等人滿之后再發車。像這種等人坐滿就發一班車的場景,就是 CyclicBarrier 所擅長的,因為它可以重復使用(不像 CountDownLatch 那樣只能用一次)。

CyclicBarrier:人齊了,老司機就發車了!

CyclicBarrier VS CountDownLatch

 

CountDownLatch:一個或者多個線程,等待另外 N 個線程完成某個事情之后才能執行。

CountDownLatch 就像玩王者農藥開局的加載一樣,所有人要等待其他人都加載 100% 之后才能開始游戲。

CyclicBarrier:人齊了,老司機就發車了!

CyclicBrrier:N 個線程相互等待,直到有足夠數量的線程都到達屏障點之后,之前等待的線程就可以繼續執行了。

CyclicBrrier 就像老司機開車一樣,如果車上還有空余的座位,那么所有人都得等著,直到座位被坐滿之后,老司機才會發車。

CyclicBarrier:人齊了,老司機就發車了!

CyclicBarrier使用

 

  1. import java.util.Date
  2. import java.util.Random; 
  3. import java.util.concurrent.*; 
  4.  
  5. public class CyclicBarrierExample { 
  6.     public static void main(String[] args) { 
  7.         // 創建 CyclicBarrier 
  8.         final CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() { 
  9.             @Override 
  10.             public void run() { 
  11.                 System.out.println("人滿了,準備發車:" + new Date()); 
  12.             } 
  13.         }); 
  14.          
  15.         // 線程調用的任務 
  16.         Runnable runnable = new Runnable() { 
  17.             @Override 
  18.             public void run() { 
  19.                 // 生成隨機數 1-3 
  20.                 int randomNumber = new Random().nextInt(3) + 1; 
  21.                 // 進入任務 
  22.                 System.out.println(String.format("我是:%s 再走:%d 秒就到車站了,現在時間:%s"
  23.                         Thread.currentThread().getName(), randomNumber, new Date())); 
  24.                 try { 
  25.                     // 模擬執行 
  26.                     TimeUnit.SECONDS.sleep(randomNumber); 
  27.                     // 調用 CyclicBarrier 
  28.                     cyclicBarrier.await(); 
  29.                     // 任務執行 
  30.                     System.out.println(String.format("線程:%s 上車,時間:%s"
  31.                             Thread.currentThread().getName(), new Date())); 
  32.                 } catch (InterruptedException e) { 
  33.                     e.printStackTrace(); 
  34.                 } catch (BrokenBarrierException e) { 
  35.                     e.printStackTrace(); 
  36.                 } 
  37.             } 
  38.         }; 
  39.  
  40.         // 創建線程池 
  41.         ExecutorService threadPool = Executors.newFixedThreadPool(10); 
  42.         // 執行任務 1 
  43.         threadPool.submit(runnable); 
  44.         // 執行任務 2 
  45.         threadPool.submit(runnable); 
  46.         // 執行任務 3 
  47.         threadPool.submit(runnable); 
  48.         // 執行任務 4 
  49.         threadPool.submit(runnable); 
  50.  
  51.         // 等待所有任務執行完終止線程池 
  52.         threadPool.shutdown(); 
  53.     } 

以上代碼執行結果如下:

CyclicBarrier:人齊了,老司機就發車了!

從上述結果可以看出:當 CyclicBarrier 的計數器設置為 2 時,線程 2 和 線程 3 都到屏障點之后,老司機才會發第一波車,再 2s 之后,線程 1 和線程 4 也同時進入了屏障點,這時候老司機又可以再發一波車了。

實現原理

 

我們先來看下 CyclicBarrier 的類圖:

CyclicBarrier:人齊了,老司機就發車了!

由上圖可知 CyclicBarrier 是基于獨占鎖 ReentrantLock 實現的,其底層也是基于 AQS 的。

在 CyclicBarrier 類的內部有一個計數器 count,當 count 不為 0 時,每個線程在到達屏障點會先調用 await 方法將自己阻塞,此時計數器會減 1,直到計數器減為 0 的時候,所有因調用 await 方法而被阻塞的線程就會被喚醒繼續執行。當 count 計數器變成 0 之后,就會進入下一輪阻塞,此時 parties(parties 是在 new CyclicBarrier(parties) 時設置的值)會將它的值賦值給 count 從而實現復用。

常用方法

 

CyclicBarrier(parties):初始化相互等待的線程數量的構造方法。

CyclicBarrier(parties,Runnable barrierAction):初始化相互等待的線程數量以及屏障線程的構造方法,當 CyclicBarrier 的計數器變為 0 時,會執行 barrierAction 構造方法。

getParties():獲取 CyclicBarrier 打開屏障的線程數量,也稱為方數。

getNumberWaiting():獲取正在CyclicBarrier上等待的線程數量。

await():在 CyclicBarrier 上進行阻塞等待,直到發生以下情形之一:在 CyclicBarrier 上等待的線程數量達到 parties,則所有線程被釋放,繼續執行;

  • 當前線程被中斷,則拋出 InterruptedException 異常,并停止等待,繼續執行;
  • 其他等待的線程被中斷,則當前線程拋出 BrokenBarrierException 異常,并停止等待,繼續執行;
  • 其他等待的線程超時,則當前線程拋出 BrokenBarrierException 異常,并停止等待,繼續執行;
  • 其他線程調用 CyclicBarrier.reset() 方法,則當前線程拋出 BrokenBarrierException 異常,并停止等待,繼續執行。

await(timeout,TimeUnit):在CyclicBarrier上進行限時的阻塞等待,直到發生以下情形之一:

  • 在 CyclicBarrier 上等待的線程數量達到 parties,則所有線程被釋放,繼續執行;
  • 當前線程被中斷,則拋出 InterruptedException 異常,并停止等待,繼續執行;
  • 當前線程等待超時,則拋出 TimeoutException 異常,并停止等待,繼續執行;
  • 其他等待的線程被中斷,則當前線程拋出 BrokenBarrierException 異常,并停止等待,繼續執行;
  • 其他等待的線程超時,則當前線程拋出 BrokenBarrierException 異常,并停止等待,繼續執行;
  • 其他線程調用 CyclicBarrier.reset() 方法,則當前線程拋出 BrokenBarrierException 異常,并停止等待,繼續執行。

isBroken():獲取是否破損標志位 broken 的值,此值有以下幾種情況:

  • CyclicBarrier 初始化時,broken=false,表示屏障未破損;
  • 如果正在等待的線程被中斷,則 broken=true,表示屏障破損;
  • 如果正在等待的線程超時,則 broken=true,表示屏障破損;
  • 如果有線程調用 CyclicBarrier.reset() 方法,則 broken=false,表示屏障回到未破損狀態。

reset():使得CyclicBarrier回歸初始狀態,直觀來看它做了兩件事:

  • 如果有正在等待的線程,則會拋出 BrokenBarrierException 異常,且這些線程停止等待,繼續執行。
  • 將是否破損標志位 broken 置為 false。

總結

 

CyclicBrrier 是通過獨占鎖 ReentrantLock 實現計數器的原子性更新的,CyclicBrrier 最常用的是 await() 方法,使用此方法會將計數器 -1,并判斷當前的計數器是否為 0,如果不為 0 就會阻塞等待,并計時器為 0 之后,才能繼續執行剩余任務。CyclicBrrier 相比于 CountDownLatch 來說,它的優勢在于可以重復使用。

參考 & 鳴謝

 

  • blog.csdn.net/qq_39241239/article/details/87030142
  • blog.csdn.net/zzg1229059735/article/details/61191679
  • www.cnblogs.com/yaochunhui/p/13494689.html

原文地址:https://mp.weixin.qq.com/s/eMpfvq3un7ILz9YlwVRdEA

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品乱码久久久久久蜜桃91 | www.午夜 | 欧美日韩精品在线 | 欧美久久久久久久久久久 | 精品久久久久久国产 | 中文字幕 国产精品 | 日韩精品一区二区三区视频播放 | 欧美成人综合 | 日韩成人在线观看视频 | 精品国产乱码久久久久久影片 | 亚洲自拍偷拍综合 | yellow在线视频免费观看 | 国产精品正在播放 | 国产一区二区在线免费观看 | 日本一区二区在线免费 | 久久精品在线视频 | 夜夜操av | 在线二区 | 中文在线一区 | 国产一区二区三区在线 | 欧美精品乱码久久久久久按摩 | 久久精品无码一区二区三区 | 日韩成人精品视频 | 久久久久久国产免费 | 久久久久一区 | 一区二区久久 | 精品国产一二三区 | 蜜桃av网址 | 91精品国产综合久久久久久漫画 | 国产成人精品综合 | 成人免费视频在线观看 | 精品无码久久久久久久动漫 | 国产在线精品一区 | 国产亚洲精品久久久久动 | 亚洲一区二区国产 | 自拍偷拍一区二区三区 | 色爱区成人综合网 | 香蕉av在线 | 欧美精品久久久久久久久老牛影院 | 国产91久久久久蜜臀青青天草二 | 韩国理论电影在线 |