1. 程式人生 > >同步輔助類 CountDownLatch、CyclicBarrier作用

同步輔助類 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 !

相關推薦

同步輔助 CountDownLatchCyclicBarrier作用

併發程式設計欄目程式碼 GitHub package 地址: 點選開啟連結 部落格併發程式設計欄目 : 點選開啟連結 對於某種需求,比如 A,B,C 三個併發的執行緒全部處理完後才執行 D 執行緒。 可以使用 join 控制等待其他執行緒完成。 比如多名參賽選手全部

java並發之同步輔助CountDownLatch

java 同步 多線程 CountDownLatch 含義: CountDownLatch可以理解為一個計數器在初始化時設置初始值,當一個線程需要等待某些操作先完成時,需要調用await()方法。這個方法讓線程進入休眠狀態直到等待的所有線程都執行完成。每調用一次countDown()方法內部計數器

併發工具 countDownLatchCyclicBarrier與Semaphore

1、等待多執行緒完成的 CountDownLatch  CountDownLatch允許一個或多個執行緒等待其他執行緒完成操作。 它的建構函式接受一個int型別的引數作為計數器,如果想等待N個點完成,這裡傳入N即可。 呼叫countDown方法時,N就會減1,await方法會阻

同步工具 CountDownLatchCyclicBarrier

在開發中,一些非同步操作會明顯加快執行速度帶來更好的體驗,但同時也增加了開發的複雜度,想了用好多執行緒,就必須從這些方面去了解 執行緒的 wait() notify() notifyall() 方法 執行緒非同步返回 Future ThreadLocal 類 執行緒池 ThreadPoolExecutor

Java 併發工具 CountDownLatchCyclicBarrierSemaphoreExchanger

> 本文部分摘自《Java 併發程式設計的藝術》 ## CountDownLatch CountDownLatch 允許一個或多個執行緒等待其他執行緒完成操作。假設現有一個需求:我們需要解析一個 Excel 裡多個 sheet 的資料,此時可以考慮使用多執行緒,每個執行緒解析一個 sheet 的資

java多執行緒:13CountDownLatch同步輔助【計數器】

使用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()方

關於對CountDownLatchCyclicBarrierSemaphore執行緒同步理解

概念描述以及程式碼理解 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 進階——併發程式設計之執行緒同步利器CountDownLatchCyclicBarrierSemaphore 的使用小結

引言 Java 語言之所以廣泛運用於服務端程式,很大一部分原因就是因為在JDK中Java 已經為我們提供了很多併發場景的解決方案,藉助這些系統方案我們可以快速應用於具體場景,甚至是在系統方案上進行擴充套件,這篇文章就好好總結下三種執行緒控制工具類。 一、

Java併發程式設計-同步輔助CyclicBarrier

在上一篇文章中我們介紹了同步輔助類CountDownLatch,在Java concurrent包下還有另一個同步輔助類CyclicBarrier與CountDownLatch非常類似,它也允許多個執行緒在某個點進行同步,但CyclicBarrier類更加強大。CyclicB

java執行緒同步輔助的使用CountDownLatch

有時候我們開發的時候會使用到多執行緒,那問題又來了,多執行緒是非同步的,有時候我們的邏輯又需要同步的時候,我們該怎麼辦呢,其實java給我們提供了一個類CountDownLatch,計數上鎖。 寫得

Java併發包5--同步工具CountDownLatchCyclicBarrierSemaphore的實現原理解析

前言: JUC中提供了很多同步工具類,比如CountDownLatch、CyclicBarrier、Semaphore等,都可以作用同步手段來實現多執行緒之間的同步效果 一、CountDownLatch 1.1、CountDownLatch的使用 CountDownLatch可以理解為是同步計數器,作用是允許

java並發--CountDownLatchCyclicBarrier和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個人,多出來的人必須在門外面等著。如何去做呢?一個解決辦法就是:房間外面掛著五把鑰匙,每進去一個人就取走一把鑰匙,沒有鑰匙的不能進入該房間而是在外面

CountDownLatchCyclicBarrier和Semaphore使用

post i++ release 正在 多少 wait rup int args CountDownLatch CountDownLatch是用來線程計數的。等待一組線程全部執行完後再本線程繼續執行。如:A線程需要等待B、C和D(由初始化CountDownLatch參數