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

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

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

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

前言:

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

一、場景描述

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

二、CyclicBarrier介紹

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

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

1. CyclicBarrier(int parties)

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

2. CyclicBarrier(int parties, Runnable barrierAction)

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

代碼示例

package com.itmyhome;

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


/**
 * 玩家類
 * @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 + "進入第二關(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("所有玩家進入第二關(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)...
所有玩家進入第二關(guān)!
玩家3進入第二關(guān)...
玩家1進入第二關(guān)...
玩家2進入第二關(guān)...
玩家0進入第二關(guān)...

CyclicBarrier和CountDownLatch的區(qū)別

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

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

相關(guān)文章

  • Java設(shè)計模式之創(chuàng)建者模式詳解

    Java設(shè)計模式之創(chuàng)建者模式詳解

    這篇文章主要介紹了Java設(shè)計模式之創(chuàng)建者模式詳解,創(chuàng)建者模式,顧名思義,就是提供友好的創(chuàng)建對象的方式?,對象都是?new?出來的,但是在一些情況下,這種方式不是很友好,首先,它不夠直觀,需要的朋友可以參考下
    2023-08-08
  • java實現(xiàn)的漢字轉(zhuǎn)五筆功能實例

    java實現(xiàn)的漢字轉(zhuǎn)五筆功能實例

    這篇文章主要介紹了java實現(xiàn)的漢字轉(zhuǎn)五筆功能,結(jié)合具體實例形式分析了java基于字符串遍歷與編碼轉(zhuǎn)換等操作實現(xiàn)五筆編碼獲取的相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • 深入理解JAVA基礎(chǔ)類庫中對象Object類

    深入理解JAVA基礎(chǔ)類庫中對象Object類

    Object類是一個特殊的類,是所有類的父類,如果一個類沒有用extends明確指出繼承于某個類,那么它默認繼承Object類。這里主要總結(jié)Object類中的兩個:toString()與equals()方法
    2021-09-09
  • Springboot下使用Redis管道(pipeline)進行批量操作

    Springboot下使用Redis管道(pipeline)進行批量操作

    本文主要介紹了Spring?boot?下使用Redis管道(pipeline)進行批量操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • 詳解Spring中的@Scope注解

    詳解Spring中的@Scope注解

    這篇文章主要介紹了詳解Spring中的@Scope注解,@Scope注解是Spring IOC容器中的一個作用域,在Spring IOC容器中,他用來配置Bean實例的作用域?qū)ο?需要的朋友可以參考下
    2023-07-07
  • Spring深入了解常用配置應用

    Spring深入了解常用配置應用

    這篇文章主要給大家介紹了關(guān)于Spring的常用配置,文中通過示例代碼介紹的非常詳細,對大家學習或者使用springboot具有一定的參考學習價值,需要的朋友可以參考下
    2022-07-07
  • Servlet實現(xiàn)簡單文件上傳功能

    Servlet實現(xiàn)簡單文件上傳功能

    這篇文章主要為大家詳細介紹了Servlet實現(xiàn)簡單文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 在JPA的@Query注解中使用limit條件(詳解)

    在JPA的@Query注解中使用limit條件(詳解)

    下面小編就為大家?guī)硪黄贘PA的@Query注解中使用limit條件(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java中excel表數(shù)據(jù)的批量導入方法

    Java中excel表數(shù)據(jù)的批量導入方法

    這篇文章主要為大家詳細介紹了Java中excel表數(shù)據(jù)的批量導入方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 兩種java實現(xiàn)二分查找的方式

    兩種java實現(xiàn)二分查找的方式

    這篇文章主要給大家分享的是java實現(xiàn)二分查找的方式,二分查找是一種查詢效率非常高的查找算法。又稱折半查找。下面文章我們介紹了兩種方法,需要的朋友可以參考一下
    2021-09-09

最新評論