1. 程式人生 > >【JAVA】java中CyclicBarrier的用法,例項講解

【JAVA】java中CyclicBarrier的用法,例項講解


一個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。 

上一篇的程式是用CountDownLatch實現的,現在用CyclicBarrier改寫試試
package thread.thread;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * ClassName:CountDownLatchTest <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON. <br/>
 * Date: 2015年7月30日 下午2:04:07 <br/>
 * 
 * @author chiwei
 * @version
 * @since JDK 1.6
 * @see
 */
public class CyclicBarrierTest {

	public static void main(String[] args) {
		ThreadPoolExecutor poolExe = new ThreadPoolExecutor(100, 1000, 1, TimeUnit.SECONDS,
			    new LinkedBlockingDeque<Runnable>(100));
		int count = 10;
		// 考試開始鈴聲響起,考試開始
		final CountDownLatch examBegin = new CountDownLatch(1);
		// 單個考生,考試結束交卷
		final CyclicBarrier student = new CyclicBarrier(count+1);

		// 一個考場10位考生
		for (int i = 0; i < count; i++) {
			Runnable runnable = new Runnable() {
				public void run() {
					try {
						System.out.println("考生" + Thread.currentThread().getName() + "在等待考試開始的鈴聲響起");
						examBegin.await();
						System.out.println("考生聽到鈴聲" + Thread.currentThread().getName() + "開始答題");
						Thread.sleep((long) (Math.random() * 100));//答題過程,真正的業務邏輯處理部分
						System.out.println("考生" + Thread.currentThread().getName() + "交卷");
						student.await();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			};
			poolExe.execute(runnable); // 運動員開始任務
		}

		try {
			// 答題時間
			Thread.sleep((long) (Math.random() * 10000));
			System.out.println("考場" + Thread.currentThread().getName() + "開始鈴聲即將響起");
			examBegin.countDown();
			System.out.println("考場" + Thread.currentThread().getName() + "考試開始鈴聲響起");
			student.await(); // 所有考生交卷
			System.out.println("考場" + Thread.currentThread().getName() + "考試結束");
		} catch (Exception e) {
			e.printStackTrace();
		}
		poolExe.shutdown();

	}

}
CountDownLatch的構造方法的引數count值是呼叫countDown的數量,而CyclicBarrier的數量是await,所以加1
考生pool-1-thread-1在等待考試開始的鈴聲響起
考生pool-1-thread-2在等待考試開始的鈴聲響起
考生pool-1-thread-6在等待考試開始的鈴聲響起
考生pool-1-thread-7在等待考試開始的鈴聲響起
考生pool-1-thread-5在等待考試開始的鈴聲響起
考生pool-1-thread-4在等待考試開始的鈴聲響起
考生pool-1-thread-10在等待考試開始的鈴聲響起
考生pool-1-thread-9在等待考試開始的鈴聲響起
考生pool-1-thread-3在等待考試開始的鈴聲響起
考生pool-1-thread-8在等待考試開始的鈴聲響起
考場main開始鈴聲即將響起
考場main考試開始鈴聲響起
考生聽到鈴聲pool-1-thread-1開始答題
考生聽到鈴聲pool-1-thread-2開始答題
考生聽到鈴聲pool-1-thread-6開始答題
考生聽到鈴聲pool-1-thread-7開始答題
考生聽到鈴聲pool-1-thread-5開始答題
考生聽到鈴聲pool-1-thread-4開始答題
考生聽到鈴聲pool-1-thread-3開始答題
考生聽到鈴聲pool-1-thread-8開始答題
考生聽到鈴聲pool-1-thread-9開始答題
考生聽到鈴聲pool-1-thread-10開始答題
考生pool-1-thread-5交卷
考生pool-1-thread-4交卷
考生pool-1-thread-9交卷
考生pool-1-thread-2交卷
考生pool-1-thread-6交卷
考生pool-1-thread-1交卷
考生pool-1-thread-10交卷
考生pool-1-thread-7交卷
考生pool-1-thread-8交卷
考生pool-1-thread-3交卷
考場main考試結束
從結果來看,和CountDownLatch達到同樣的效果。

注意二者的區別:

CountDownLatch是在多個執行緒都執行的countDown後才觸發事件,喚醒await在latch上的執行緒,而執行countDown的執行緒,在執行完countDown後繼續自己執行緒的工作;

CyclicBarrier是一個柵欄,用於同步所有呼叫await方法的執行緒,並且等所有執行緒都到了await方法的時候,它們一起返回繼續各自的工作,最外層的一個await是的計數到0,才是的所有執行緒得以繼續執行;因為使用CyclicBarrier的執行緒會阻塞在await方法上,所以線上程池中使用要格外小心,如果執行緒池的執行緒數量過少,就會發生死鎖

student.await();
System.out.println("看看CyclicBarrier的await方法能不能把我阻塞住!");
考生pool-1-thread-1在等待考試開始的鈴聲響起
考生pool-1-thread-3在等待考試開始的鈴聲響起
考生pool-1-thread-2在等待考試開始的鈴聲響起
考生pool-1-thread-4在等待考試開始的鈴聲響起
考生pool-1-thread-5在等待考試開始的鈴聲響起
考生pool-1-thread-6在等待考試開始的鈴聲響起
考生pool-1-thread-7在等待考試開始的鈴聲響起
考生pool-1-thread-8在等待考試開始的鈴聲響起
考生pool-1-thread-9在等待考試開始的鈴聲響起
考生pool-1-thread-10在等待考試開始的鈴聲響起
考場main開始鈴聲即將響起
考場main考試開始鈴聲響起
考生聽到鈴聲pool-1-thread-1開始答題
考生聽到鈴聲pool-1-thread-2開始答題
考生聽到鈴聲pool-1-thread-5開始答題
考生聽到鈴聲pool-1-thread-7開始答題
考生聽到鈴聲pool-1-thread-10開始答題
考生聽到鈴聲pool-1-thread-3開始答題
考生聽到鈴聲pool-1-thread-9開始答題
考生聽到鈴聲pool-1-thread-8開始答題
考生聽到鈴聲pool-1-thread-6開始答題
考生聽到鈴聲pool-1-thread-4開始答題
考生pool-1-thread-2交卷
考生pool-1-thread-10交卷
考生pool-1-thread-1交卷
考生pool-1-thread-3交卷
考生pool-1-thread-5交卷
考生pool-1-thread-4交卷
考生pool-1-thread-8交卷
考生pool-1-thread-7交卷
考生pool-1-thread-6交卷
考生pool-1-thread-9交卷
看看CyclicBarrier的await方法能不能把我阻塞住!
考場main考試結束
看看CyclicBarrier的await方法能不能把我阻塞住!
看看CyclicBarrier的await方法能不能把我阻塞住!
看看CyclicBarrier的await方法能不能把我阻塞住!
看看CyclicBarrier的await方法能不能把我阻塞住!
看看CyclicBarrier的await方法能不能把我阻塞住!
看看CyclicBarrier的await方法能不能把我阻塞住!
看看CyclicBarrier的await方法能不能把我阻塞住!
看看CyclicBarrier的await方法能不能把我阻塞住!
看看CyclicBarrier的await方法能不能把我阻塞住!
從結果來看,CyclicBarrier的await方法的確阻塞當前執行緒的繼續執行,只有計數到0才會得以全部繼續執行。
student.countDown();
System.out.println("看看CountDownLatch的countDown方法能不能把我阻塞住!");
考生pool-1-thread-1在等待考試開始的鈴聲響起
考生pool-1-thread-3在等待考試開始的鈴聲響起
考生pool-1-thread-2在等待考試開始的鈴聲響起
考生pool-1-thread-4在等待考試開始的鈴聲響起
考生pool-1-thread-5在等待考試開始的鈴聲響起
考生pool-1-thread-6在等待考試開始的鈴聲響起
考生pool-1-thread-9在等待考試開始的鈴聲響起
考生pool-1-thread-8在等待考試開始的鈴聲響起
考生pool-1-thread-7在等待考試開始的鈴聲響起
考生pool-1-thread-10在等待考試開始的鈴聲響起
考場main開始鈴聲即將響起
考場main考試開始鈴聲響起
考生聽到鈴聲pool-1-thread-3開始答題
考生聽到鈴聲pool-1-thread-2開始答題
考生聽到鈴聲pool-1-thread-1開始答題
考生pool-1-thread-2交卷
考生聽到鈴聲pool-1-thread-10開始答題
考生聽到鈴聲pool-1-thread-7開始答題
考生聽到鈴聲pool-1-thread-8開始答題
考生聽到鈴聲pool-1-thread-9開始答題
考生聽到鈴聲pool-1-thread-6開始答題
考生聽到鈴聲pool-1-thread-5開始答題
考生聽到鈴聲pool-1-thread-4開始答題
考生pool-1-thread-9交卷
看看CountDownLatch的countDown方法能不能把我阻塞住!
看看CountDownLatch的countDown方法能不能把我阻塞住!
考生pool-1-thread-10交卷
看看CountDownLatch的countDown方法能不能把我阻塞住!
考生pool-1-thread-7交卷
看看CountDownLatch的countDown方法能不能把我阻塞住!
考生pool-1-thread-4交卷
看看CountDownLatch的countDown方法能不能把我阻塞住!
考生pool-1-thread-3交卷
看看CountDownLatch的countDown方法能不能把我阻塞住!
考生pool-1-thread-5交卷
看看CountDownLatch的countDown方法能不能把我阻塞住!
考生pool-1-thread-6交卷
看看CountDownLatch的countDown方法能不能把我阻塞住!
考生pool-1-thread-1交卷
看看CountDownLatch的countDown方法能不能把我阻塞住!
考生pool-1-thread-8交卷
看看CountDownLatch的countDown方法能不能把我阻塞住!
考場main考試結束
而CountDownLatch的countDown方法執行後,執行緒會繼續執行,不會阻塞。


相關推薦

JAVAjavaCyclicBarrier用法例項講解

一個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用

JAVAjavaCountDownLatch的用法例項講解

CountDownLatch主要用於多執行緒環境中,當所有的執行緒都countDown了,就會釋放所有的等待的執行緒,await在到0之前一直等待。 直接看一段程式碼: package thread.thread; import java.util.concurrent

Javatry有returnfinally塊執行問題

對於如下的一段程式: package try_catch_finally_return; public class TCFRtest { private static void Test1() { try { System.out.println("tr

C++static用法總結

地址:https://www.cnblogs.com/qiaoconglovelife/p/5323086.html 1.用於區域性變數 C++中區域性變數有三種: (1)auto:此關鍵詞常常省略。auto type a 常常簡寫為type a。 如:int a=auto int

Pythonpythonplot用法——線條、點、顏色

圖的存在,讓資料變得形象化。無論多麼複雜的東西,都是簡單的組合。 plot畫圖時可以設定線條引數。包括:顏色、線型、標記風格。 1)控制顏色 顏色之間的對應關係為 b---blue   c---cyan  g---green    k----black m---magent

小家javaJava對時間戳相加減的問題(向前推100天答案卻讓我匪夷所思)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

小家javaJava的執行緒池你真的用對了嗎?(教你用正確的姿勢使用執行緒池)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

封裝java為什麼要將屬性進行私有化又使用set和get方法來設定和獲取屬性呢?

其實這裡體現的就是封裝的思想: 將資料與行為進行分離。 試想, 如果外面的程式可以隨意修改一個類的成員變數,會造成不可預料的程式錯誤, 就象一個人的名字, 不能被外部隨意修改,只能通過各種給定的方法去

Spring 配置sessionFactory及用法JAVA後端)

編輯 刪除 Spring 中配置sessionFactory及用法 方法一: 1、在Spring的applicationContext.xml中配置bean  <!-- 啟用註解注入  -->       <context:annota

小家javaJava二進位制與位運算(“^,&,>>,>>>”)使用移位演算法寫一個流水號生成器(訂單號生成器)

相關閱讀 每篇一句 高樓大廈,都是平地起的。 整個java體系,其實就是一本祕籍,那就是:java基礎! (基礎如果打的紮實,在實際開發工作中會帶來極大的助益) 二進位制 二進位制是計算技術中廣泛採用的一種數制。二進位制資料是用0和1兩個數碼來表示的

1000行代碼徒手寫正則表達式引擎1--JAVA正則表達式的使用

基礎上 unicode 要求 [1] 分配 find 通過 images char 簡介: 本文是系列博客的第一篇,主要講解和分析正則表達式規則以及JAVA中原生正則表達式引擎的使用。在後續的文章中會涉及基於NFA的正則表達式引擎內部的工作原理,並在此基礎上用1000行左右

轉載JavaComparable和Comparator比較

import 比較器 todo itl 復制代碼 ack div array open 【本文轉自】http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 簡介 Comparable 是排序接口。 若一

JavaJava的數據類型

target java 基本數據類型 item ref cnblogs com 技術分享 aik Java 語言是一種強類型語言。通俗點說就是,在 Java 中存儲的數據都是有類型的,而且必須在編譯時就確定其類型。Java 數據類型分為兩類,如圖: 在 Jav

Java得到當前系統時間精確到毫秒

logs out println -1 gettime system public pan time import java.text.SimpleDateFormat; import java.util.Date; import java.util.Calenda

javajava反射機制動態獲取對象的屬性和對應的參數值並屬性按照字典序排序Field.setAccessible()方法的說明可用於微信支付 簽名生成

modifier 直接 this 字段值 1-1 讓我 toupper ima play 方法1:通過get()方法獲取屬性值 package com.sxd.test.controller; public class FirstCa{ private

java日誌組件介紹(common-logginglog4jslf4jlogback )

微秒 是把 輸出重定向 gin ons java 循環 框架 log4j.jar common-logging common-logging是apache提供的一個通用的日誌接口。用戶可以自由選擇第三方的日誌組件作為具體實現,像log4j,或者jdk自帶的lo

轉載Java DecimalFormat 用法

最快 public oid get div 科學計數 科學 符號 一個 轉載只供個人學習參考,以下查看請前往原出處:http://blog.csdn.net/wangchangshuai0010/article/details/8577982 我們經常要將數字進行格式化,比

轉載JAVAIO流操作的基本規律總結

reader 對象 作文 若是 gpo 是否 目的 io流 基本 流操作的基本規律:三個明確 1.明確源和目的; 源:輸入流即讀取流 InputStream,Reader 目的:輸出流即寫入流 OutputStream, Writer 2.明確操作的數據是

javajava byte[]、File、InputStream 互相轉換

new 文件名 讀寫 文件 tps byte數組 lan http 過程 ========================================================================= 使用過程中,一定要註意close()掉各個讀寫流!!