成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

詳解Java回環(huán)屏障CyclicBarrier

瀏覽:12日期:2022-08-25 08:18:34

上一篇說的CountDownLatch是一個計數器,類似線程的join方法,但是有一個缺陷,就是當計數器的值到達0之后,再調用CountDownLatch的await和countDown方法就會立刻返回,就沒有作用了,那么反正是一個計數器,為什么不能重復使用呢?于是就出現(xiàn)了這篇說的CyclicBarrier,它的狀態(tài)可以被重用;

一.簡單例子

用法其實和CountDownLatch差不多,也就是一個計數器,當計數器的值變?yōu)?之后,就會把阻塞的線程喚醒:

package com.example.demo.study;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Study0216 { // 注意這里的構造器,第一個參數表示計數器初始值 // 第二個參數表示當計數器的值變?yōu)?的時候就觸發(fā)的任務 static CyclicBarrier cyclicBarrier = new CyclicBarrier(2, () -> { System.out.println('cyclicBarrier task '); }); public static void main(String[] args) { // 新建兩個線程的線程池 ExecutorService pool = Executors.newFixedThreadPool(2); // 線程1放入線程池中 pool.submit(() -> { try { System.out.println('Thread1----await-begin'); cyclicBarrier.await(); System.out.println('Thread1----await-end'); } catch (Exception e) { e.printStackTrace(); } }); // 線程2放到線程池中 pool.submit(() -> { try { System.out.println('Thread2----await-begin'); cyclicBarrier.await(); System.out.println('Thread2----await-end'); } catch (Exception e) { e.printStackTrace(); } }); // 關閉線程池,此時還在執(zhí)行的任務會繼續(xù)執(zhí)行 pool.shutdown(); }}

詳解Java回環(huán)屏障CyclicBarrier

 我們再看看CyclicBarrier的復用性,這里比如有一個任務,有三部分組成,分別是A,B,C,然后創(chuàng)建兩個線程去執(zhí)行這個任務,必須要等到兩個線程都執(zhí)行完成A部分,然后才能開始執(zhí)行B,只有兩個線程都執(zhí)行完成B部分,才能執(zhí)行C:

package com.example.demo.study;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Study0216 { // 這里的構造器,只有一個參數,表示計數器初始值 static CyclicBarrier cyclicBarrier = new CyclicBarrier(2); public static void main(String[] args) { // 新建兩個線程的線程池 ExecutorService pool = Executors.newFixedThreadPool(2); // 線程1放入線程池中 pool.submit(() -> { try { System.out.println('Thread1----stepA-start'); cyclicBarrier.await();System.out.println('Thread1----stepB-start'); cyclicBarrier.await();System.out.println('Thread1----stepC-start'); } catch (Exception e) { e.printStackTrace(); } }); // 線程2放到線程池中 pool.submit(() -> { try { System.out.println('Thread2----stepA-start'); cyclicBarrier.await();System.out.println('Thread2----stepB-start'); cyclicBarrier.await();System.out.println('Thread2----stepC-start'); } catch (Exception e) { e.printStackTrace(); } }); // 關閉線程池,此時還在執(zhí)行的任務會繼續(xù)執(zhí)行 pool.shutdown(); }}

詳解Java回環(huán)屏障CyclicBarrier

二.基本原理

我們看看一些重要屬性:

public class CyclicBarrier { //這個內部類只有一個boolean值 private static class Generation { boolean broken = false; } //獨占鎖 private final ReentrantLock lock = new ReentrantLock(); //條件變量 private final Condition trip = lock.newCondition(); //保存線程的總數 private final int parties; //這是一個任務,通過構造器傳遞一個任務,當計數器變?yōu)?之后,就可以執(zhí)行這個任務 private final Runnable barrierCommand; //這類內部之后一個boolean的值,表示屏障是否被打破 private Generation generation = new Generation(); //計數器 private int count;}

構造器:

//我們的構造器初始值設置的是partiespublic CyclicBarrier(int parties) { this(parties, null);}//注意,這里開始的時候是count等于parties//為什么要有兩個變量呢?我們每次調用await方法的時候count減一,當count的值變?yōu)?之后,怎么又還原成初始值呢?//直接就把parties的值賦值給count就行了呀,簡單吧!public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw new IllegalArgumentException(); this.parties = parties; this.count = parties; this.barrierCommand = barrierAction;}

然后再看看await方法:

public int await() throws InterruptedException, BrokenBarrierException { try { //調用的是dowait方法 return dowait(false, 0L); } catch (TimeoutException toe) { throw new Error(toe); // cannot happen }}//假設count等于3,有三個線程都在調用這個方法,默認超時時間為0,那么首每次都只有一個線程可以獲取鎖,將count減一,不為0//就會到下面的for循環(huán)中扔到條件隊列中掛起;直到第三個線程調用這個dowait方法,count減一等于0,那么當前線程執(zhí)行任務之后,//就會喚醒條件變量中阻塞的線程,并重置count為初始值3private int dowait(boolean timed, long nanos)throws InterruptedException, BrokenBarrierException, TimeoutException { //獲取鎖 final ReentrantLock lock = this.lock; lock.lock(); try { //g中只有一個boolean值 final Generation g = generation; //如果g中的值為true的時候,拋錯 if (g.broken) throw new BrokenBarrierException(); //如果當前線程中斷,就拋錯 if (Thread.interrupted()) { breakBarrier(); throw new InterruptedException(); } //count減一,再賦值給index int index = --count; //如果index等于0的時候,說明所有的線程已經到屏障點了,就可以 if (index == 0) { // tripped boolean ranAction = false; try { //執(zhí)行當前線程的任務 final Runnable command = barrierCommand; if (command != null) command.run(); ranAction = true; //喚醒其他因為調用了await方法阻塞的線程 nextGeneration(); return 0; } finally { if (!ranAction) breakBarrier(); } } //能到這里來,說明是count不等于0,也就是還有的線程沒有到屏障點 for (;;) { try { //wait方法有兩種情況,一種是設置超時時間,一種是不設置超時時間 //這里就是對超時時間進行的一個判斷,如果設置的超時時間為0,則會在條件隊列中無限的等待下去,直到被喚醒 //設置了超時時間,那就等待該時間 if (!timed) trip.await(); else if (nanos > 0L) nanos = trip.awaitNanos(nanos); } catch (InterruptedException ie) { if (g == generation && ! g.broken) { breakBarrier(); throw ie; } else { Thread.currentThread().interrupt(); } } if (g.broken) throw new BrokenBarrierException(); if (g != generation) return index; if (timed && nanos <= 0L) { breakBarrier(); throw new TimeoutException(); } } } finally { //釋放鎖 lock.unlock(); }}//喚醒其他因為調用了await方法阻塞的線程private void nextGeneration() { //喚醒條件變量中所有線程 trip.signalAll(); //重置count的值 count = parties; generation = new Generation();}private void breakBarrier() { generation.broken = true; //重置count為初始值parties count = parties; //喚醒條件隊列中的所有線程 trip.signalAll();}

以上就是詳解Java回環(huán)屏障CyclicBarrier的詳細內容,更多關于Java CyclicBarrier的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
天堂成人免费av电影一区| 国产成人免费视频网站高清观看视频| 国产精品18久久久久久久网站| 97久久精品人人做人人爽50路 | 99riav久久精品riav| 久久天天综合| 亚洲欧美一区二区视频| 成人深夜视频在线观看| 蜜桃av一区二区三区| 欧美精品1区| 日韩一区二区麻豆国产| 男女性色大片免费观看一区二区| 欧美国产三级| 欧美精品一级二级三级| 调教+趴+乳夹+国产+精品| 国产精品成人观看视频免费| 制服丝袜激情欧洲亚洲| 日韩成人dvd| 国产裸体歌舞团一区二区| 99在线精品视频在线观看| 国产日韩欧美麻豆| 国产成人精品免费在线| 欧美在线观看一区| 亚洲国产精品麻豆| 激情久久婷婷| 国产午夜精品在线观看| 国产91在线|亚洲| 欧美日韩国产系列| 石原莉奈在线亚洲三区| 国产精品综合| 亚洲精品国产无天堂网2021| 国产精品sm| 中文字幕成人av| 91小视频在线| 日韩一区二区在线播放| 秋霞电影一区二区| 久久精品免费| 午夜久久电影网| 国产精品久久久对白| 成人欧美一区二区三区| 欧美日韩ab| 国产精品视频观看| 欧美精品一区二区视频| 国产日韩精品一区二区三区| 99久久er热在这里只有精品15| 日韩免费高清电影| 国产91富婆露脸刺激对白| 日韩免费福利电影在线观看| 成人性色生活片| 91.xcao| 国产九色sp调教91| 欧美一区二区三区小说| 国产精品欧美久久久久一区二区 | 国产成人综合自拍| 欧美福利视频一区| 国模冰冰炮一区二区| 欧美美女一区二区| 欧美日本不卡视频| 成人免费三级在线| 亚洲日本护士毛茸茸| 亚洲在线视频免费观看| 国产精品亚洲视频| 亚洲美女屁股眼交3| 国产精品一二三四五| 欧美大片一区| 91国偷自产一区二区开放时间| 国产精品成人午夜| 国产一区二区三区国产| 亚洲激情不卡| 午夜精品久久久久| 国产乱人伦偷精品视频不卡 | 久久国产精品99久久人人澡| 99国产精品视频免费观看| 色综合久久久久综合99| 欧美r级电影在线观看| 亚洲午夜久久久久| 成人激情综合网站| 翔田千里一区二区| 亚洲h在线观看| 国产精品欧美精品| 国产精品综合二区| 欧美性色黄大片| 久久精品视频在线看| 亚洲精品精品亚洲| 亚洲黄色影片| 国产亚洲美州欧州综合国| 麻豆精品精品国产自在97香蕉| 91视频国产观看| 99这里有精品| 精品视频123区在线观看| 一区二区三区欧美视频| 久久精品视频一区| 精品在线播放午夜| 天堂在线一区二区| 国产综合一区二区| 欧美一级xxx| 国产农村妇女精品一区二区| 2017欧美狠狠色| 亚洲国产欧洲综合997久久| 欧美日韩视频一区二区三区| 狂野欧美性猛交xxxx巴西| 欧美高清一级片在线观看| 午夜精品一区二区三区四区| 秋霞电影网一区二区| 欧美综合欧美视频| 久久综合五月| 国产精品理论片| 在线看日韩精品电影| 91精品国产欧美一区二区| 国产精品国产三级国产aⅴ中文| 亚洲一区二区精品在线| 久久成人久久鬼色| 三级影片在线观看欧美日韩一区二区| 色综合久久综合中文综合网| 亚洲成在人线在线播放| 亚洲免费网址| 一本色道久久综合亚洲精品不| 琪琪久久久久日韩精品| 欧美韩国日本不卡| 噜噜噜噜噜久久久久久91| 美女视频免费一区| 久久午夜精品| 青青草原综合久久大伊人精品| 日韩丝袜情趣美女图片| 一本色道久久综合亚洲91| 偷拍与自拍一区| 精品久久久久av影院| 亚洲一二三区精品| 精品国产91久久久久久久妲己| 亚洲午夜久久久久久久久电影网 | 国产久卡久卡久卡久卡视频精品| 自拍偷自拍亚洲精品播放| 777a∨成人精品桃花网| 在线一区免费观看| 色婷婷综合在线| 综合色天天鬼久久鬼色| 久久综合亚州| 极品美女销魂一区二区三区免费| 久久成人麻豆午夜电影| 日韩毛片精品高清免费| 久久久久久**毛片大全| 欧美日免费三级在线| 欧美一区二区三区在线视频| 99精品国产99久久久久久白柏| 99在线精品免费| 久久久一区二区三区| 精品婷婷伊人一区三区三| 国产精品乱码一区二区三区| 高清国产午夜精品久久久久久| 一区二区三区四区五区视频在线观看| 伊人蜜桃色噜噜激情综合| 日本一道高清亚洲日美韩| 日韩一区欧美小说| 国产欧美一区二区三区鸳鸯浴| 日韩精品一区二区三区中文精品| 久久久精彩视频| 狠狠v欧美v日韩v亚洲ⅴ| 91麻豆国产香蕉久久精品| 日韩欧美亚洲国产另类| 丝袜脚交一区二区| 欧美顶级少妇做爰| 制服丝袜激情欧洲亚洲| 日韩欧美成人激情| 日韩欧美国产综合在线一区二区三区| 色婷婷亚洲一区二区三区| 国产一区二区成人久久免费影院| 国产美女精品人人做人人爽| 精品制服美女丁香| 丝瓜av网站精品一区二区 | 东方aⅴ免费观看久久av| 色婷婷香蕉在线一区二区| 欧美精品一卡两卡| 亚洲一级二级三级在线免费观看| 另类亚洲自拍| 久久色.com| 欧美欧美午夜aⅴ在线观看| 欧美亚洲国产一区二区三区va | 69堂国产成人免费视频| 久久人人九九| 8x8x8国产精品| 2020国产精品自拍| 26uuu亚洲综合色| 一区二区三区久久久| 欧美一区二区视频在线观看 | 成人精品一区二区三区中文字幕| 日韩国产欧美视频| 国产欧美日韩综合精品二区| 成人免费看片app下载| 日韩成人一级大片| 国内精品美女在线观看| 亚洲精品中文在线观看| 中文字幕在线一区二区三区| 国产成人福利片| 亚洲欧美日本视频在线观看| 精品一区二区三区免费视频| 精东粉嫩av免费一区二区三区| 国产精品国产精品| 欧美高清视频一二三区| 亚洲一区精品在线| 欧美日韩精品一区二区三区蜜桃 |