CyclicBarrier和CountDownLatch的使用方法

原创 2018年04月15日 19:24:52

CyclicBarrier

使一组线程都到达某一个点时,再一起执行。线程调用CyclicBarrier的await()方法,等待其他线程的到来,直到所有目标线程都执行了await()方法后,这些线程才可以继续往下执行,或由最后一个到达的线程执行指定任务(传入Runnable参数)。

使用举例

闪电侠、绿箭侠和超人三人相约一起去拯救世界,三人必须都到齐了才能开始打Boss,谁最后到的,谁发号施令,招呼大家开打。这里可以看到,CyclicBarrier的构造方法中传入的Runnable,是由最后执行await()的线程来执行的。

import java.util.concurrent.*;
public class CyclicBarrierTest {
    static class personThread implements Runnable{
        CyclicBarrier barrier;
        String name;
        public personThread(String name, CyclicBarrier barrier){
            this.name = name;
            this.barrier = barrier;
        }

        @Override
        public void run(){
            try {
                Thread.sleep(2000);
                System.out.println(name + " is ready! My ID is "+Thread.currentThread().getId());
                barrier.await();
                Thread.sleep(1000);
                System.out.println(name + " is fighting!");
            }catch (BrokenBarrierException exception){
                exception.printStackTrace();          
            }catch (InterruptedException exception){
                exception.printStackTrace();
            }
        }
    }

    public static void main(String[] args){
        CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
            @Override
            public void run() {
                System.out.println("Now, let's save the world! " + Thread.currentThread().getId());
            }
        });
        ExecutorService executor = Executors.newFixedThreadPool(3);
        executor.execute(new personThread("the Flash",barrier));
        executor.execute(new personThread("the Green Arrow", barrier));
        executor.execute(new personThread("the Super Man", barrier));
        executor.shutdown();

    }

}

/*运行结果
the Super Man is ready! My ID is 13
the Green Arrow is ready! My ID is 12
the Flash is ready! My ID is 11
Now, let's save the world! 11
the Super Man is fighting!
the Green Arrow is fighting!
the Flash is fighting!*/

CountDownLatch

直译过来就是倒计时门闩,可以让一些调用了await()方法的线程等待count个线程调用countDown()方法后,再继续执行。CountDownLatch用一次就废了,不能循环使用,而CylicBarrier可以循环使用。

使用举例

神奇女侠想出去嗨皮,但是她发现自己没带钱,于是叫了闪电侠、绿箭侠和超人出来,他们每人随意带一些钱,等他们都到了,神奇女侠就带着他们的钱嗨皮去了。

import java.util.Random;
import java.util.concurrent.*;
public class CountDownLatchTest {
    static class PersonTread implements Callable<Integer>{
        CountDownLatch latch;
        String name;

        PersonTread(String name, CountDownLatch latch){
            this.name = name;
            this.latch = latch;
        }
        @Override
        public Integer call(){
            try {
                int money = new Random().nextInt(100);
                System.out.println("I'm "+name+", I have " + money+"$.");
                TimeUnit.SECONDS.sleep(2);
                latch.countDown();
                return money;

            }catch (Exception e){
                e.printStackTrace();
                return 0;
            }
        }
    }

       public static void main(String[] args){
        CountDownLatch latch = new CountDownLatch(3);
        ExecutorService executor = Executors.newCachedThreadPool();
        Future<Integer> future1 = executor.submit(new PersonTread("the Flash", latch));
        Future<Integer> future2 = executor.submit(new PersonTread("the Green Arrow",latch));
        Future<Integer> future3 = executor.submit(new PersonTread("the Superman",latch ));
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    latch.await();
                    System.out.println("I'm eating watermelons...");
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        });
        executor.shutdown();
        try {
            latch.await();
            int money = future1.get() + future2.get() + future3.get();
            System.out.println("I'm the Wonder Women, now I have "+money+"$ to have fun! Bye guys!");
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}
/*运行结果
I'm the Green Arrow, I have 53$.
I'm the Flash, I have 62$.
I'm the Superman, I have 88$.
I'm eating watermelons...
I'm the Wonder Women, now I have 203$ to have fun! Bye guys!
*/
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenge_j/article/details/79951916

CountDownLatch和CyclicBarrier的应用场景

jdk1.5之后,java的concurrent包提供了一些并发工具类,比如CountDownLatch和CyclicBarrier,这里只讲它们的应用场景,暂不作原理剖析。 CountDownLa...
  • suibo0912hf
  • suibo0912hf
  • 2015-09-15 09:07:49
  • 1216

你真的理解CountDownLatch与CyclicBarrier使用场景吗?

相信每个想深入了解多线程开发的Java开发者都会遇到CountDownLatch和CyclicBarrier,大家也在网上看到各种介绍原理,代码的,以及他们区别(应付面试)的,但是很少能讲清楚:他们到...
  • zzg1229059735
  • zzg1229059735
  • 2017-03-10 10:20:01
  • 776

多线程之CountDownLatch和CyclicBarrier的区别和用法

一.CountDownLatch的使用 CountDownLatch经常用于监听某些初始化操作,等初始化执行完毕后,再通知主线程继续工作。 CountDownLatch定义: 一个同步辅助类,在完成...
  • a347911
  • a347911
  • 2016-12-05 16:10:11
  • 609

CyclicBarrier和CountDownLatch区别

这两天写多线程时,用到了CyclicBarrier,下意识的认为CyclicBarrier和CountDownLatch作用很像,就翻阅资料查了一下,说一下他们的区别吧 CyclicBarr...
  • tolcf
  • tolcf
  • 2016-03-18 19:19:10
  • 10063

java 中间件学习4-CountDownLatch、CyclicBarrier、Future和FutureTask

1、CountDownLatchCountDownLatch主要提供的机制是多个线程都达到了预期状态或完成预期工作时触发事件,其他线程可以等待这个事件来触发自己后续的工作,这里等待线程是可以多个。例如...
  • u011513159
  • u011513159
  • 2015-06-09 20:01:34
  • 668

CountDownLatch与CyclicBarrier详解

1. CountDownLatch 1.1 简介 CountDownLatch是一个同步辅助类,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。...
  • xianymo
  • xianymo
  • 2015-07-13 17:34:45
  • 1479

CountDownLatch、CyclicBarrier、Semaphore共同之处与区别以及各自使用场景

摘要: jdk1.5之后,java的concurrent包提供了一些并发工具类,比如CountDownLatch和CyclicBarrier,Semaphore。这里简要的比较一下他们的共同之处与区别...
  • jackyechina
  • jackyechina
  • 2016-10-26 10:55:09
  • 2979

Java并发工具类CountDownLatch和CyclicBarrier

1.CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作,其构造函数接收一个int型的参数作为计数器,若想等待N个点完成,就传人N。此处的N个点,可指N个线程...
  • darrensun2014
  • darrensun2014
  • 2016-04-03 20:59:42
  • 457

CountDownLatch和CyclicBarrier原理的分析理解

学concurrent并发包的时候,看到countDownLatch和CyclicBarrier有些相似的地方.所以放在一起进行学习分析一下. 首先看一下jdk注释的第一句话简单阐明二者各自的意...
  • ruanjian1111ban
  • ruanjian1111ban
  • 2017-02-27 11:48:12
  • 452

闭锁CountDownLatch和栅栏CyclicBarrier之异同举例

CountDownLatch和CyclicBarrier的主要联系和区别如下: 1.闭锁CountDownLatch做减计数,而栅栏CyclicBarrier则是加计数。 2.CountDownLat...
  • gaolu
  • gaolu
  • 2015-05-29 09:02:51
  • 11025
收藏助手
不良信息举报
您举报文章:CyclicBarrier和CountDownLatch的使用方法
举报原因:
原因补充:

(最多只允许输入30个字)