欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的?CyclicBarrier詳解

 更新時間:2022年04月13日 18:07:44   作者:灰太狼_cxh  
這篇文章主要介紹了Java中的?CyclicBarrier詳解,CyclicBarrier沒有顯示繼承哪個父類或者實現(xiàn)哪個父接口,?所有AQS和重入鎖不是通過繼承實現(xiàn)的,而是通過組合實現(xiàn)的,下文相關(guān)內(nèi)容需要的小伙伴可以參考一下

CyclicBarrier簡介

對于CountDownLatch,其他線程為游戲玩家,比如英雄聯(lián)盟,主線程為控制游戲開始的線程。在所有的玩家都準備好之前,主線程是處于等待狀態(tài)的,也就是游戲不能開始。當所有的玩家準備好之后,下一步的動作實施者為主線程,即開始游戲。

對于CyclicBarrier,假設(shè)有一家公司要全體員工進行團建活動,活動內(nèi)容為翻越三個障礙物,每一個人翻越障礙物所用的時間是不一樣的。但是公司要求所有人在翻越當前障礙物之后再開始翻越下一個障礙物,也就是所有人翻越第一個障礙物之后,才開始翻越第二個,以此類推。類比地,每一個員工都是一個“其他線程”。當所有人都翻越的所有的障礙物之后,程序才結(jié)束。而主線程可能早就結(jié)束了,這里我們不用管主線程。

CyclicBarrier源碼分析

類的繼承關(guān)系

CyclicBarrier沒有顯示繼承哪個父類或者實現(xiàn)哪個父接口, 所有AQS和重入鎖不是通過繼承實現(xiàn)的,而是通過組合實現(xiàn)的。

public class CyclicBarrier {}
```  

### 類的內(nèi)部類

CyclicBarrier類存在一個內(nèi)部類Generation,每一次使用的CycBarrier可以當成Generation的實例,其源代碼如下

```java
private static class Generation {
boolean broken = false;
}

說明: Generation類有一個屬性broken,用來表示當前屏障是否被損壞。

?類的屬性

public class CyclicBarrier {

/** The lock for guarding barrier entry */
// 可重入鎖
private final ReentrantLock lock = new ReentrantLock();
/** Condition to wait on until tripped */
// 條件隊列
private final Condition trip = lock.newCondition();
/** The number of parties */
// 參與的線程數(shù)量
private final int parties;
/* The command to run when tripped */
// 由最后一個進入 barrier 的線程執(zhí)行的操作
private final Runnable barrierCommand;
/** The current generation */
// 當前代
private Generation generation = new Generation();
// 正在等待進入屏障的線程數(shù)量
private int count;
}

說明: 該屬性有一個為ReentrantLock對象,有一個為Condition對象,而Condition對象又是基于AQS的,所以,歸根到底,底層還是由AQS提供支持。

類的構(gòu)造函數(shù)

CyclicBarrier(int, Runnable)型構(gòu)造函數(shù)

public CyclicBarrier(int parties, Runnable barrierAction) {
// 參與的線程數(shù)量小于等于0,拋出異常
if (parties <= 0) throw new IllegalArgumentException();
// 設(shè)置parties
this.parties = parties;
// 設(shè)置count
this.count = parties;
// 設(shè)置barrierCommand
this.barrierCommand = barrierAction;
}

說明: 該構(gòu)造函數(shù)可以指定關(guān)聯(lián)該CyclicBarrier的線程數(shù)量,并且可以指定在所有線程都進入屏障后的執(zhí)行動作,該執(zhí)行動作由最后一個進行屏障的線程執(zhí)行。

CyclicBarrier(int)型構(gòu)造函數(shù)

public CyclicBarrier(int parties) {
// 調(diào)用含有兩個參數(shù)的構(gòu)造函數(shù)
this(parties, null);
}

說明: 該構(gòu)造函數(shù)僅僅執(zhí)行了關(guān)聯(lián)該CyclicBarrier的線程數(shù)量,沒有設(shè)置執(zhí)行動作。

核心函數(shù) - dowait函數(shù)

此函數(shù)為CyclicBarrier類的核心函數(shù),CyclicBarrier類對外提供的await函數(shù)在底層都是調(diào)用該了doawait函數(shù),

其源代碼如下:

private int dowait(boolean timed, long nanos)
throws InterruptedException, BrokenBarrierException,
TimeoutException {
// 保存當前鎖
final ReentrantLock lock = this.lock;
// 鎖定
lock.lock();
try {
// 保存當前代
final Generation g = generation;

if (g.broken) // 屏障被破壞,拋出異常
throw new BrokenBarrierException();

if (Thread.interrupted()) { // 線程被中斷
// 損壞當前屏障,并且喚醒所有的線程,只有擁有鎖的時候才會調(diào)用
breakBarrier();
// 拋出異常
throw new InterruptedException();
}

// 減少正在等待進入屏障的線程數(shù)量
int index = --count;
if (index == 0) { // 正在等待進入屏障的線程數(shù)量為0,所有線程都已經(jīng)進入
// 運行的動作標識
boolean ranAction = false;
try {
// 保存運行動作
final Runnable command = barrierCommand;
if (command != null) // 動作不為空
// 運行
command.run();
// 設(shè)置ranAction狀態(tài)
ranAction = true;
// 進入下一代
nextGeneration();
return 0;
} finally {
if (!ranAction) // 沒有運行的動作
// 損壞當前屏障
breakBarrier();
}
}

// loop until tripped, broken, interrupted, or timed out
// 無限循環(huán)
for (;;) {
try {
if (!timed) // 沒有設(shè)置等待時間
// 等待
trip.await();
else if (nanos > 0L) // 設(shè)置了等待時間,并且等待時間大于0
// 等待指定時長
nanos = trip.awaitNanos(nanos);
} catch (InterruptedException ie) {
if (g == generation && ! g.broken) { // 等于當前代并且屏障沒有被損壞
// 損壞當前屏障
breakBarrier();
// 拋出異常
throw ie;
} else { // 不等于當前帶后者是屏障被損壞
// We're about to finish waiting even if we had not
// been interrupted, so this interrupt is deemed to
// "belong" to subsequent execution.
// 中斷當前線程
Thread.currentThread().interrupt();
}
}

if (g.broken) // 屏障被損壞,拋出異常
throw new BrokenBarrierException();

if (g != generation) // 不等于當前代
// 返回索引
return index;

if (timed && nanos <= 0L) { // 設(shè)置了等待時間,并且等待時間小于0
// 損壞屏障
breakBarrier();
// 拋出異常
throw new TimeoutException();
}
}
} finally {
// 釋放鎖
lock.unlock();
}
}

核心函數(shù) - nextGeneration函數(shù)

此函數(shù)在所有線程進入屏障后會被調(diào)用,即生成下一個版本,所有線程又可以重新進入到屏障中,

其源代碼如下:

private void nextGeneration() {
// signal completion of last generation
// 喚醒所有線程
trip.signalAll();
// set up next generation
// 恢復(fù)正在等待進入屏障的線程數(shù)量
count = parties;
// 新生一代
generation = new Generation();
}

在此函數(shù)中會調(diào)用AQS的signalAll方法,即喚醒所有等待線程。如果所有的線程都在等待此條件,則喚醒所有線程。

其源代碼如:

public final void signalAll() {
if (!isHeldExclusively()) // 不被當前線程獨占,拋出異常
throw new IllegalMonitorStateException();
// 保存condition隊列頭節(jié)點
Node first = firstWaiter;
if (first != null) // 頭節(jié)點不為空
// 喚醒所有等待線程
doSignalAll(first);
}

到此這篇關(guān)于Java中的 CyclicBarrier詳解的文章就介紹到這了,更多相關(guān)Java中的 CyclicBarrier內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)猜數(shù)字小游戲

    java實現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)猜數(shù)字小游戲,隨機給定一個數(shù)字,直到猜對大小,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • JavaEE線程安全定時器模式任務(wù)

    JavaEE線程安全定時器模式任務(wù)

    這篇文章主要介紹了JavaEE線程安全定時器模式任務(wù),定時器模式像是一個鬧鐘定時,在一定時間之后被喚醒并執(zhí)行某個之前設(shè)定好的任務(wù),感興趣的小伙伴可以參考一下
    2022-06-06
  • IDEA入門級使用教程你居然還在用eclipse?

    IDEA入門級使用教程你居然還在用eclipse?

    上個月,idea的使用量超越eclipse的消息席卷了整個IT界,idea到底好在哪里呢?下面小編通過本文給大家詳細介紹下IDEA入門級使用教程,非常詳細,感興趣的朋友一起看看吧
    2020-10-10
  • java多態(tài)中的就近原則介紹

    java多態(tài)中的就近原則介紹

    大家好,本篇文章主要講的是java多態(tài)中的就近原則介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 詳解如何獲取PreparedStatement參數(shù)示例詳解

    詳解如何獲取PreparedStatement參數(shù)示例詳解

    這篇文章主要為大家介紹了詳解如何獲取PreparedStatement參數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Mybatis-Plus字段策略FieldStrategy的使用

    Mybatis-Plus字段策略FieldStrategy的使用

    本文主要介紹了Mybatis-Plus字段策略FieldStrategy的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java使用udp實現(xiàn)簡單多人聊天功能

    java使用udp實現(xiàn)簡單多人聊天功能

    這篇文章主要為大家詳細介紹了java使用udp實現(xiàn)簡單多人聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java 重寫時應(yīng)當遵守的 11 條規(guī)則

    Java 重寫時應(yīng)當遵守的 11 條規(guī)則

    這篇文章主要介紹了Java 重寫時應(yīng)當遵守的 11 條規(guī)則,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Mybatis結(jié)果集自動映射的實例代碼

    Mybatis結(jié)果集自動映射的實例代碼

    在使用Mybatis時,有的時候我們可以不用定義resultMap,而是直接在<select>語句上指定resultType。這個時候其實就用到了Mybatis的結(jié)果集自動映射,下面通過本文給大家分享Mybatis結(jié)果集自動映射的實例代碼,一起看看吧
    2017-02-02
  • 使用Log4j2代碼方式配置實現(xiàn)線程級動態(tài)控制

    使用Log4j2代碼方式配置實現(xiàn)線程級動態(tài)控制

    這篇文章主要介紹了使用Log4j2代碼方式配置實現(xiàn)線程級動態(tài)控制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論