最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)編程(CyclicBarrier)實(shí)例詳解

 更新時(shí)間:2017年07月19日 12:01:27   作者:麥田  
這篇文章主要介紹了Java并發(fā)編程(CyclicBarrier)實(shí)例詳解的相關(guān)資料,JAVA編寫(xiě)并發(fā)程序的時(shí)候,我們需要仔細(xì)去思考一下并發(fā)流程的控制,如何讓各個(gè)線程之間協(xié)作完成某項(xiàng)工作。

Java并發(fā)編程(CyclicBarrier)實(shí)例詳解

前言:

  使用JAVA編寫(xiě)并發(fā)程序的時(shí)候,我們需要仔細(xì)去思考一下并發(fā)流程的控制,如何讓各個(gè)線程之間協(xié)作完成某項(xiàng)工作。有時(shí)候,我們啟動(dòng)N個(gè)線程去做一件事情,只有當(dāng)這N個(gè)線程都達(dá)到某一個(gè)臨界點(diǎn)的時(shí)候,我們才能繼續(xù)下面的工作,就是說(shuō)如果這N個(gè)線程中的某一個(gè)線程先到達(dá)預(yù)先定義好的臨界點(diǎn),它必須等待其他N-1線程也到達(dá)這個(gè)臨界點(diǎn),接下來(lái)的工作才能繼續(xù),只要這N個(gè)線程中有1個(gè)線程沒(méi)有到達(dá)所謂的臨界點(diǎn),其他線程就算搶先到達(dá)了臨界點(diǎn),也只能等待,只有所有這N個(gè)線程都到達(dá)臨界點(diǎn)后,接下來(lái)的事情才能繼續(xù)。

一、場(chǎng)景描述

有四個(gè)游戲玩家玩游戲,游戲有三個(gè)關(guān)卡,每個(gè)關(guān)卡必須要所有玩家都到達(dá)后才能允許通過(guò)。其實(shí)這個(gè)場(chǎng)景里的玩家中如果有玩家A先到了關(guān)卡1,他必須等到其他所有玩家都到達(dá)關(guān)卡1時(shí)才能通過(guò),也就是說(shuō)線程之間需要相互等待。這和CountDownLatch的應(yīng)用場(chǎng)景有區(qū)別,CountDownLatch里的線程是到了運(yùn)行的目標(biāo)后繼續(xù)干自己的其他事情,而這里的線程需要等待其他線程后才能繼續(xù)完成下面的工作。

二、CyclicBarrier介紹

CyclicBarrier 的字面意思是可循環(huán)使用(Cyclic)的屏障(Barrier)。它要做的事情是,讓一組線程到達(dá)一個(gè)屏障(也可以叫同步點(diǎn))時(shí)被阻塞,直到最后一個(gè)線程到達(dá)屏障時(shí),屏障才會(huì)開(kāi)門(mén),所有被屏障攔截的線程才會(huì)繼續(xù)干活。CyclicBarrier默認(rèn)的構(gòu)造方法是CyclicBarrier(int parties),其參數(shù)表示屏障攔截的線程數(shù)量,每個(gè)線程調(diào)用await方法告訴CyclicBarrier我已經(jīng)到達(dá)了屏障,然后當(dāng)前線程被阻塞。

CyclicBarrier類(lèi)有兩個(gè)常用的構(gòu)造方法:

1. CyclicBarrier(int parties)

這里的parties也是一個(gè)計(jì)數(shù)器,例如,初始化時(shí)parties里的計(jì)數(shù)是3,于是擁有該CyclicBarrier對(duì)象的線程當(dāng)parties的計(jì)數(shù)為3時(shí)就喚醒,注:這里parties里的計(jì)數(shù)在運(yùn)行時(shí)當(dāng)調(diào)用CyclicBarrier:await()時(shí),計(jì)數(shù)就加1,一直加到初始的值

2. CyclicBarrier(int parties, Runnable barrierAction)

這里的parties與上一個(gè)構(gòu)造方法的解釋是一樣的,這里需要解釋的是第二個(gè)入?yún)?Runnable barrierAction),這個(gè)參數(shù)是一個(gè)實(shí)現(xiàn)Runnable接口的類(lèi)的對(duì)象,也就是說(shuō)當(dāng)parties加到初始值時(shí)就出發(fā)barrierAction的內(nèi)容。

代碼示例

package com.itmyhome;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;


/**
 * 玩家類(lèi)
 * @author itmyhome
 *
 */
class Player implements Runnable {
  private CyclicBarrier cyclicBarrier;
  private int id;

  public Player(int id, CyclicBarrier cyclicBarrier) {
    this.cyclicBarrier = cyclicBarrier;
    this.id = id;
  }

  @Override
  public void run() {
    try {
      System.out.println("玩家" + id + "正在玩第一關(guān)...");
      cyclicBarrier.await();
      System.out.println("玩家" + id + "進(jìn)入第二關(guān)...");
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (BrokenBarrierException e) {
      e.printStackTrace();
    }
  }
}


public class CyclicBarrierTest {
  public static void main(String[] args) {
    // CyclicBarrier cyclicBarrier = new CyclicBarrier(4);
    CyclicBarrier cyclicBarrier = new CyclicBarrier(4,
        new Runnable() {
          @Override
          public void run() {
            System.out.println("所有玩家進(jìn)入第二關(guān)!");
          }
        });

    for (int i = 0; i < 4; i++) {
      new Thread(new Player(i, cyclicBarrier)).start();
    }
  }
}

輸出結(jié)果:

玩家0正在玩第一關(guān)...
玩家3正在玩第一關(guān)...
玩家2正在玩第一關(guān)...
玩家1正在玩第一關(guān)...
所有玩家進(jìn)入第二關(guān)!
玩家3進(jìn)入第二關(guān)...
玩家1進(jìn)入第二關(guān)...
玩家2進(jìn)入第二關(guān)...
玩家0進(jìn)入第二關(guān)...

CyclicBarrier和CountDownLatch的區(qū)別

  • CountDownLatch: 一個(gè)線程(或者多個(gè)), 等待另外N個(gè)線程完成某個(gè)事情之后才能執(zhí)行。
  • CyclicBarrier: N個(gè)線程相互等待,任何一個(gè)線程完成之前,所有的線程都必須等待。
  • CountDownLatch的計(jì)數(shù)器只能使用一次。而CyclicBarrier的計(jì)數(shù)器可以使用reset() 方法重置。所以CyclicBarrier能處理更為復(fù)雜的業(yè)務(wù)場(chǎng)景,比如如果計(jì)算發(fā)生錯(cuò)誤,可以重置計(jì)數(shù)器,并讓線程們重新執(zhí)行一次。
  • CountDownLatch:減計(jì)數(shù)方式,CyclicBarrier:加計(jì)數(shù)方式

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 詳解spring切面使用傳遞給被通知方法的參數(shù)

    詳解spring切面使用傳遞給被通知方法的參數(shù)

    本篇文章主要介紹了詳解spring切面使用傳遞給被通知方法的參數(shù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Java反射機(jī)制概念、原理與用法總結(jié)

    Java反射機(jī)制概念、原理與用法總結(jié)

    這篇文章主要介紹了Java反射機(jī)制概念、原理與用法,較為詳細(xì)的分析了java反射機(jī)制的概念、原理,并結(jié)合實(shí)例形式總結(jié)分析了java反射機(jī)制的具體使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-11-11
  • 解讀Java中Set真的是無(wú)序的嗎

    解讀Java中Set真的是無(wú)序的嗎

    這篇文章主要介紹了Java中Set是不是無(wú)序的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 常用的Java數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn)匯總

    常用的Java數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn)匯總

    這篇文章主要介紹了常用的Java數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn)匯總,數(shù)據(jù)結(jié)構(gòu)分線性數(shù)據(jù)結(jié)構(gòu)和非線性數(shù)據(jù)結(jié)構(gòu),下面對(duì)此作詳細(xì)介紹,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)或工作有所幫助
    2022-03-03
  • Mybatis中${param}與#{param}的區(qū)別說(shuō)明

    Mybatis中${param}與#{param}的區(qū)別說(shuō)明

    這篇文章主要介紹了Mybatis中${param}與#{param}的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring集成MyBatis和PageHelper分頁(yè)插件整合過(guò)程詳解

    Spring集成MyBatis和PageHelper分頁(yè)插件整合過(guò)程詳解

    Spring?整合?MyBatis?是將?MyBatis?數(shù)據(jù)訪問(wèn)框架與?Spring?框架進(jìn)行集成,以實(shí)現(xiàn)更便捷的開(kāi)發(fā)和管理,在集成過(guò)程中,Spring?提供了許多特性和功能,如依賴(lài)注入、聲明式事務(wù)管理、AOP?等,這篇文章主要介紹了Spring集成MyBatis和PageHelper分頁(yè)插件整合,需要的朋友可以參考下
    2023-08-08
  • java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明

    java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java Scala的隱式轉(zhuǎn)換詳解

    Java Scala的隱式轉(zhuǎn)換詳解

    隱式轉(zhuǎn)換是在Scala編譯器進(jìn)行類(lèi)型匹配時(shí),如果找不到合適的類(lèi)型,那么隱式轉(zhuǎn)換會(huì)讓編譯器在作用范圍內(nèi)自動(dòng)推導(dǎo)出來(lái)合適的類(lèi)型。本文通過(guò)代碼示例介紹了Scala的隱式轉(zhuǎn)換,感興趣的小伙伴可以參考閱讀
    2023-04-04
  • Spring Boot中使用Spring-data-jpa的配置方法詳解

    Spring Boot中使用Spring-data-jpa的配置方法詳解

    今天小編就為大家分享一篇關(guān)于Spring Boot中使用Spring-data-jpa的配置方法詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • java實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘并設(shè)置鬧鐘功能

    java實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘并設(shè)置鬧鐘功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘并設(shè)置鬧鐘功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論

司法| 昌乐县| 财经| 乳山市| 疏附县| 汾阳市| 宜川县| 双城市| 浙江省| 庆元县| 安福县| 新民市| 包头市| 运城市| 临猗县| 迁西县| 昌都县| 稻城县| 西华县| 佳木斯市| 海口市| 都匀市| 宝应县| 涿鹿县| 嘉荫县| 民丰县| 黑龙江省| 楚雄市| 洞口县| 台南市| 宁德市| 太保市| 民县| 博客| 宝山区| 建始县| 镇原县| 屯留县| 新乡县| 红原县| 二连浩特市|