日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

詳解Java回環屏障CyclicBarrier

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

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

一.簡單例子

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

package com.example.demo.study;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Study0216 { // 注意這里的構造器,第一個參數表示計數器初始值 // 第二個參數表示當計數器的值變為0的時候就觸發的任務 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(); } }); // 關閉線程池,此時還在執行的任務會繼續執行 pool.shutdown(); }}

詳解Java回環屏障CyclicBarrier

 我們再看看CyclicBarrier的復用性,這里比如有一個任務,有三部分組成,分別是A,B,C,然后創建兩個線程去執行這個任務,必須要等到兩個線程都執行完成A部分,然后才能開始執行B,只有兩個線程都執行完成B部分,才能執行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(); } }); // 關閉線程池,此時還在執行的任務會繼續執行 pool.shutdown(); }}

詳解Java回環屏障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; //這是一個任務,通過構造器傳遞一個任務,當計數器變為0之后,就可以執行這個任務 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的值變為0之后,怎么又還原成初始值呢?//直接就把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循環中扔到條件隊列中掛起;直到第三個線程調用這個dowait方法,count減一等于0,那么當前線程執行任務之后,//就會喚醒條件變量中阻塞的線程,并重置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 { //執行當前線程的任務 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回環屏障CyclicBarrier的詳細內容,更多關于Java CyclicBarrier的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人日韩精品| 国产精品视频3p| 视频在线观看一区| 秋霞影视一区二区三区| 亚洲精品无吗| 午夜国产欧美理论在线播放 | 亚洲我射av| 伊人精品视频| 日韩免费av| 韩国精品主播一区二区在线观看| 国产精品videossex久久发布 | 日韩av电影一区| 欧美偷窥清纯综合图区| 久久影院一区二区三区| 欧美日韩一区二区高清| 国产精品一区二区三区美女| 老色鬼精品视频在线观看播放| 国产一区二区三区黄网站| 国产精品天堂蜜av在线播放| av不卡在线| 久久亚洲精品伦理| 亚洲精品人人| 国产精品高潮呻吟久久久久| 国产精品对白| 欧美专区一区二区三区| 亚洲综合欧美| 国产福利一区二区精品秒拍| 福利欧美精品在线| 婷婷精品视频| 午夜久久99| 国产色播av在线| 日本不卡视频在线观看| 欧美久久久网站| 色在线中文字幕| 久久av一区二区三区| 国产欧美一区二区三区国产幕精品 | 黄色av日韩| 国产欧美午夜| 亚洲涩涩在线| 亚洲毛片一区| 极品裸体白嫩激情啪啪国产精品| 亚洲精品综合| 亚洲女同av| 69堂免费精品视频在线播放| 欧美国产专区| 老牛影视一区二区三区| 久久精品福利| 久久狠狠亚洲综合| 亚洲精品成人| 青青草国产精品亚洲专区无| 美女精品一区| 免费观看亚洲天堂| 日韩二区三区在线观看| 欧美国产先锋| 国产亚洲久久| 爽好久久久欧美精品| 成人在线视频中文字幕| 日韩中文字幕在线一区| 日韩av网站免费在线| 国产一区二区三区自拍| 亚洲精品观看| 亚洲精品三级| 日韩高清在线不卡| 午夜一级在线看亚洲| 亚洲国产欧美日本视频| 91久久午夜| 亚洲男女av一区二区| 精品久久视频| 美国三级日本三级久久99 | 中文字幕日本一区二区| 欧美日韩国产高清电影| 欧美在线91| 国产亚洲综合精品| 视频二区不卡| 国产激情在线播放| аⅴ资源天堂资源库在线| 高清在线一区| 亚洲91精品| 国产麻豆综合| 亚州精品视频| 五月婷婷六月综合| 亚洲视频电影在线| 91看片一区| 中文字幕人成乱码在线观看| 黄在线观看免费网站ktv| 国产成人精品一区二区三区免费| 久久99影视| 日韩国产欧美一区二区| 高清久久一区| 日韩在线短视频| 国产精品s色| 日韩国产一二三区| 福利一区二区| 欧洲激情综合| 日韩欧美久久| 日韩精品dvd| 激情综合在线| 欧美日本一区| 精品亚洲美女网站| 久久久一本精品| 黄色亚洲在线| 亚洲伦乱视频| 日韩av不卡在线观看| 好看不卡的中文字幕| 亚洲www啪成人一区二区| 视频在线观看一区| 精品午夜视频| 一区二区国产在线| 日韩精品欧美| 国产日本精品| 国产亚洲一区二区手机在线观看| 国产精品玖玖玖在线资源| 久久婷婷激情| 青青伊人久久| 日韩精品一区第一页| 婷婷亚洲成人| 精精国产xxxx视频在线野外| 国产精品一区二区三区四区在线观看 | 婷婷综合成人| 午夜精品成人av| 国产免费播放一区二区| 日韩免费精品| 精品免费av| 日韩高清在线不卡| 精品午夜av| 久久精品av麻豆的观看方式| 国产精品丝袜xxxxxxx| 国产va在线视频| 国产精品一区二区精品| 石原莉奈在线亚洲二区| 三级欧美在线一区| 亚洲欧美日韩国产| 综合一区av| 亚洲一区二区三区高清| 欧美特黄一级大片| 国产精品久久久久av电视剧| 亚洲精品福利电影| 91视频久久| 福利一区视频| 欧美激情综合| 色爱综合网欧美| 久久在线免费| 亚洲午夜久久久久久尤物 | 欧美精品97| 日韩精品五月天| 日韩中文字幕一区二区三区| 国产精品美女午夜爽爽| 视频一区二区不卡| 欧美亚洲免费| 首页国产欧美日韩丝袜| 国产一区二区精品福利地址| 国产麻豆精品| 国产一区二区三区探花| 国产精品黄色片| 国产成人在线中文字幕| 国产亚洲一卡2卡3卡4卡新区| 国产99久久| 九九久久国产| 国产精品夜夜夜| 日韩精品高清不卡| 视频一区二区国产| 狠狠干综合网| 欧洲激情综合| 91久久久精品国产| 99精品综合| 91九色精品| 狠狠操综合网| 99国产精品久久久久久久成人热| 麻豆精品少妇| 欧美xxxx性| 精品成av人一区二区三区| 国产精品免费精品自在线观看| 日本麻豆一区二区三区视频| 一区二区电影| 日韩精品成人| 久久精品av麻豆的观看方式| 国产毛片精品久久| 国产精品久久久久毛片大屁完整版| 日韩精品一区二区三区免费视频| 免费看日韩精品| 日韩精品视频中文字幕| 日韩不卡一区二区| 日本欧美在线| 精品国产网站| 欧美一区自拍| 精品久久久网| 91精品蜜臀一区二区三区在线| 成人午夜国产| 中文一区一区三区免费在线观 | 日韩深夜视频| 欧洲一区二区三区精品| 欧美久久精品一级c片| 亚洲精品一二三**| 欧美1区2区3| 欧美精品一二| 国产毛片精品| 欧美91福利在线观看| 日日摸夜夜添夜夜添国产精品| 麻豆久久久久久| 黄色av一区|