同步輔助類 CountDownLatch、CyclicBarrier作用
併發程式設計欄目程式碼 GitHub package 地址: 點選開啟連結
部落格併發程式設計欄目 : 點選開啟連結
對於某種需求,比如 A,B,C 三個併發的執行緒全部處理完後才執行 D 執行緒。
可以使用 join 控制等待其他執行緒完成。
比如多名參賽選手全部準備好後才起跑,即全部到達一個點後執行後面的方法。
Doug Lea 在併發包裡封裝了更好的處理類
下面演示CountDownLatch、CyclicBarrier用法
CountDownLatch演示3個執行緒全部完成後執行後面的方法
package com.thread.concurrent_.basis; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * CountDownLatch : * 一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。 * 用給定的計數 初始化 CountDownLatch。 * 由於呼叫了 countDown()方法,所以在當前計數到達零之前,await方法會一直受阻塞。 * 之後,會釋放所有等待的執行緒,await的所有後續呼叫都將立即返回。 * 這種現象只出現一次——計數無法被重置。 * <p> * CountDownLatch 很適合用來將一個任務分為n個獨立的部分,等這些部分都完成後繼續接下來的任務, * CountDownLatch 只能出發一次,計數值不能被重置。 * * @author wei.Li by 14-8-22. */ public class CountDownLatchTest { //同步完成一個事件的執行的執行緒數量 public static final int SYNCHRONIZED_DONE_THREAD_NUM = 3; //宣告同步輔助類 private static CountDownLatch countDownLatch = new CountDownLatch(SYNCHRONIZED_DONE_THREAD_NUM); //執行緒池 public static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(SYNCHRONIZED_DONE_THREAD_NUM + 1); /** * 模擬多個執行緒執行任務 */ public static void analogThreads() { for (int i = 0; i < SYNCHRONIZED_DONE_THREAD_NUM; i++) { EXECUTOR_SERVICE.submit(new Callable<Object>() { @Override public Object call() throws Exception { Thread.sleep(new Random().nextInt(20000)); //執行結束後計數器-1 countDownLatch.countDown(); System.out.println(this + " -> done ! " + ".the current countDownLatch is " + countDownLatch.getCount()); return true; } }); } EXECUTOR_SERVICE.shutdown(); } public static void main(String[] args) { System.out.println("~~~~~~~~ start ~~~~~~~~"); //模擬多執行緒協作執行 analogThreads(); try { //等等計數器歸 0 ,即執行緒全部完成 countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("~~~~~~~~ done ~~~~~~~~"); } }
執行結果
~~~~~~~~ start ~~~~~~~~
[email protected] -> done ! .the current countDownLatch is 2
[email protected] -> done ! .the current countDownLatch is 1
[email protected] -> done ! .the current countDownLatch is 0
~~~~~~~~ done ~~~~~~~~
CyclicBarrier演示所有選手準備好後才開始起跑
package com.thread.concurrent_.basis; import java.io.IOException; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 一個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。 * 在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 CyclicBarrier 很有用。 * 因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。 * <p> * 需要所有的子任務都完成時,才執行主任務,這個時候就可以選擇使用CyclicBarrier。 * <p> * 演示所有選手進入場地後,全部準備好後開始起跑! * * @author wei.Li by 14-8-23. */ public class CyclicBarrierTest { //參加跑步比賽的人數 public static final int FOOTRACE_NUM = 5; //執行緒池 private static ExecutorService executor = Executors.newFixedThreadPool(FOOTRACE_NUM); private static CyclicBarrier barrier = new CyclicBarrier(FOOTRACE_NUM); // 一個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point) static class Footrace implements Runnable { private CyclicBarrier barrier; private String name; public Footrace(CyclicBarrier barrier, String name) { super(); this.barrier = barrier; this.name = name; } @Override public void run() { try { System.out.println(name + " in the location..."); Thread.sleep(1000 * (new Random()).nextInt(8));//準備中 System.out.println(name + " say : I am ready ..."); // barrier的await方法,在所有參與者都已經在此 barrier 上呼叫 await 方法之前,將一直等待。 barrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } System.out.println(name + " go !"); } } public static void main(String[] args) throws IOException, InterruptedException { for (int i = 0; i < FOOTRACE_NUM; i++) { executor.submit(new Thread( new Footrace(barrier, i + "號選手") )); } executor.shutdown(); } }
執行結果
0號選手 in the location...2號選手 in the location...
3號選手 in the location...
1號選手 in the location...
4號選手 in the location...
2號選手 say : I am ready ...
3號選手 say : I am ready ...
4號選手 say : I am ready ...
1號選手 say : I am ready ...
0號選手 say : I am ready ...
0號選手 go !
2號選手 go !
3號選手 go !
1號選手 go !
4號選手 go !
相關推薦
同步輔助類 CountDownLatch、CyclicBarrier作用
併發程式設計欄目程式碼 GitHub package 地址: 點選開啟連結 部落格併發程式設計欄目 : 點選開啟連結 對於某種需求,比如 A,B,C 三個併發的執行緒全部處理完後才執行 D 執行緒。 可以使用 join 控制等待其他執行緒完成。 比如多名參賽選手全部
java並發之同步輔助類CountDownLatch
java 同步 多線程 CountDownLatch 含義: CountDownLatch可以理解為一個計數器在初始化時設置初始值,當一個線程需要等待某些操作先完成時,需要調用await()方法。這個方法讓線程進入休眠狀態直到等待的所有線程都執行完成。每調用一次countDown()方法內部計數器
併發工具類 countDownLatch、CyclicBarrier與Semaphore
1、等待多執行緒完成的 CountDownLatch CountDownLatch允許一個或多個執行緒等待其他執行緒完成操作。 它的建構函式接受一個int型別的引數作為計數器,如果想等待N個點完成,這裡傳入N即可。 呼叫countDown方法時,N就會減1,await方法會阻
同步工具類 CountDownLatch 和 CyclicBarrier
在開發中,一些非同步操作會明顯加快執行速度帶來更好的體驗,但同時也增加了開發的複雜度,想了用好多執行緒,就必須從這些方面去了解 執行緒的 wait() notify() notifyall() 方法 執行緒非同步返回 Future ThreadLocal 類 執行緒池 ThreadPoolExecutor
Java 併發工具類 CountDownLatch、CyclicBarrier、Semaphore、Exchanger
> 本文部分摘自《Java 併發程式設計的藝術》 ## CountDownLatch CountDownLatch 允許一個或多個執行緒等待其他執行緒完成操作。假設現有一個需求:我們需要解析一個 Excel 裡多個 sheet 的資料,此時可以考慮使用多執行緒,每個執行緒解析一個 sheet 的資
java多執行緒:13、CountDownLatch同步輔助類【計數器】
使用CountDownLatch計數器模擬賽跑比賽 import java.util.Random; import java.util.concurrent.CountDownLatch; imp
CountDownLatch同步輔助類
一個 ron title exceptio exc 指定 throw http bsp CountDownLatch,一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。 主要方法 public CountDownLatch(int co
java並發之同步輔助類CyclicBarrier
java 多線程 CyclicBarrier含義: 柵欄允許兩個或者多個線程在某個集合點同步。當一個線程到達集合點時,它將調用await()方法等待其它的線程。線程調用await()方法後,CyclicBarrier將阻塞這個線程並將它置入休眠狀態等待其它線程的到來。等最後一個線程調用await()方
關於對CountDownLatch、CyclicBarrier、Semaphore執行緒同步理解
概念描述以及程式碼理解 CountDownLatch(閉鎖) 出現再JDK1.5中,主要是使一個執行緒A或是組執行緒A等待其它執行緒執行完畢後,一個執行緒A或是組執行緒A才繼續執行,可以實現執行緒組同步執行,並在所有執行緒組結束後再執行等待的執行緒,閉鎖的
Java併發程式設計-同步輔助類之CountDownLatch
操作方法建構函式CountDownLatch(int count),count表示要等待的運算元的數目。await()方法,阻塞等待,需要其他執行緒完成期待的操作,直到count為0。countDown()方法,當某一個操作完成後,呼叫此方法,count數減一。CountDo
java.util.concurrent下同步輔助類CyclicBarrier
CyclicBarrier--同步輔助類,它允許一組執行緒相互等待,直到到達某個公共屏障點(common barrier point),在涉及一組固定大小的執行緒的程式中,這些執行緒必須
Java 進階——併發程式設計之執行緒同步利器CountDownLatch、CyclicBarrier、Semaphore 的使用小結
引言 Java 語言之所以廣泛運用於服務端程式,很大一部分原因就是因為在JDK中Java 已經為我們提供了很多併發場景的解決方案,藉助這些系統方案我們可以快速應用於具體場景,甚至是在系統方案上進行擴充套件,這篇文章就好好總結下三種執行緒控制工具類。 一、
Java併發程式設計-同步輔助類之CyclicBarrier
在上一篇文章中我們介紹了同步輔助類CountDownLatch,在Java concurrent包下還有另一個同步輔助類CyclicBarrier與CountDownLatch非常類似,它也允許多個執行緒在某個點進行同步,但CyclicBarrier類更加強大。CyclicB
java執行緒同步輔助類的使用CountDownLatch
有時候我們開發的時候會使用到多執行緒,那問題又來了,多執行緒是非同步的,有時候我們的邏輯又需要同步的時候,我們該怎麼辦呢,其實java給我們提供了一個類CountDownLatch,計數上鎖。 寫得
Java併發包5--同步工具CountDownLatch、CyclicBarrier、Semaphore的實現原理解析
前言: JUC中提供了很多同步工具類,比如CountDownLatch、CyclicBarrier、Semaphore等,都可以作用同步手段來實現多執行緒之間的同步效果 一、CountDownLatch 1.1、CountDownLatch的使用 CountDownLatch可以理解為是同步計數器,作用是允許
java並發--CountDownLatch、CyclicBarrier和Semaphore
目錄 tar -- 事情 信號 available trac 直接 tro 在java 1.5中,提供了一些非常有用的輔助類來幫助我們進行並發編程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我們就來學習一下這三個輔助類的用法。
java並發之同步輔助類
ren new read sys art trac final 所有 ber CyclicBarrier 的字面意思是可循環使用(Cyclic)的屏障(Barrier)。它要做的事情是,讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個線程到達屏障時,屏障才會開
java並發之同步輔助類semaphore
java 信號量 semaphore(sem??f?r)含義: 信號量就是可以聲明多把鎖(包括一把鎖:此時為互斥信號量)。舉個例子:一個房間如果只能容納5個人,多出來的人必須在門外面等著。如何去做呢?一個解決辦法就是:房間外面掛著五把鑰匙,每進去一個人就取走一把鑰匙,沒有鑰匙的不能進入該房間而是在外面
CountDownLatch、CyclicBarrier和Semaphore使用
post i++ release 正在 多少 wait rup int args CountDownLatch CountDownLatch是用來線程計數的。等待一組線程全部執行完後再本線程繼續執行。如:A線程需要等待B、C和D(由初始化CountDownLatch參數