【JAVA】java中CyclicBarrier的用法,例項講解
一個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。
上一篇的程式是用CountDownLatch實現的,現在用CyclicBarrier改寫試試CountDownLatch的構造方法的引數count值是呼叫countDown的數量,而CyclicBarrier的數量是await,所以加1package 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達到同樣的效果。考生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是在多個執行緒都執行的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方法執行後,執行緒會繼續執行,不會阻塞。相關推薦
【JAVA】java中CyclicBarrier的用法,例項講解
一個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用
【JAVA】java中CountDownLatch的用法,例項講解
CountDownLatch主要用於多執行緒環境中,當所有的執行緒都countDown了,就會釋放所有的等待的執行緒,await在到0之前一直等待。 直接看一段程式碼: package thread.thread; import java.util.concurrent
【Java】try中有return,finally塊執行問題
對於如下的一段程式: 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
【Python】python中plot用法——線條、點、顏色
圖的存在,讓資料變得形象化。無論多麼複雜的東西,都是簡單的組合。 plot畫圖時可以設定線條引數。包括:顏色、線型、標記風格。 1)控制顏色 顏色之間的對應關係為 b---blue c---cyan g---green k----black m---magent
【小家java】Java中對時間戳相加減的問題(向前推100天,答案卻讓我匪夷所思)
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
【小家java】Java中的執行緒池,你真的用對了嗎?(教你用正確的姿勢使用執行緒池)
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
【Java】給定一個字串str,和一個字母ch,請實現相應的程式碼求出一個數組,使陣列中每個數字表示該位置與字母ch之間的最短距離。 比如str=”lexinfintech” ch=”i” 則輸出為:[3,2,1,0,1,1,0,1,2,3,4,5]
import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @author: ycz * @date: 2018/12/17 0017 16:43 * @description: */ p
【封裝】java中為什麼要將屬性進行私有化,又使用set和get方法來設定和獲取屬性呢?
其實這裡體現的就是封裝的思想: 將資料與行為進行分離。 試想, 如果外面的程式可以隨意修改一個類的成員變數,會造成不可預料的程式錯誤, 就象一個人的名字, 不能被外部隨意修改,只能通過各種給定的方法去
【轉】Spring 中配置sessionFactory及用法(JAVA後端)
編輯 刪除 Spring 中配置sessionFactory及用法 方法一: 1、在Spring的applicationContext.xml中配置bean <!-- 啟用註解注入 --> <context:annota
【小家java】Java中二進位制與位運算(“^,&,>>,>>>”),使用移位演算法寫一個流水號生成器(訂單號生成器)
相關閱讀 每篇一句 高樓大廈,都是平地起的。 整個java體系,其實就是一本祕籍,那就是:java基礎! (基礎如果打的紮實,在實際開發工作中會帶來極大的助益) 二進位制 二進位制是計算技術中廣泛採用的一種數制。二進位制資料是用0和1兩個數碼來表示的
1000行代碼徒手寫正則表達式引擎【1】--JAVA中正則表達式的使用
基礎上 unicode 要求 [1] 分配 find 通過 images char 簡介: 本文是系列博客的第一篇,主要講解和分析正則表達式規則以及JAVA中原生正則表達式引擎的使用。在後續的文章中會涉及基於NFA的正則表達式引擎內部的工作原理,並在此基礎上用1000行左右
【轉載】Java中Comparable和Comparator比較
import 比較器 todo itl 復制代碼 ack div array open 【本文轉自】http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 簡介 Comparable 是排序接口。 若一
【Java】Java中的數據類型
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
【java】java反射機制,動態獲取對象的屬性和對應的參數值,並屬性按照字典序排序,Field.setAccessible()方法的說明【可用於微信支付 簽名生成】
modifier 直接 this 字段值 1-1 讓我 toupper ima play 方法1:通過get()方法獲取屬性值 package com.sxd.test.controller; public class FirstCa{ private
【轉】java日誌組件介紹(common-logging,log4j,slf4j,logback )
微秒 是把 輸出重定向 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 我們經常要將數字進行格式化,比
【轉載】JAVA中IO流操作的基本規律總結
reader 對象 作文 若是 gpo 是否 目的 io流 基本 流操作的基本規律:三個明確 1.明確源和目的; 源:輸入流即讀取流 InputStream,Reader 目的:輸出流即寫入流 OutputStream, Writer 2.明確操作的數據是
【java】java 中 byte[]、File、InputStream 互相轉換
new 文件名 讀寫 文件 tps byte數組 lan http 過程 ========================================================================= 使用過程中,一定要註意close()掉各個讀寫流!!