java CountDownLatch

Listing 6-1. Using a Countdown Latch to Trigger a Coordinated Start
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchDemo
{
    final static int NTHREADS = 3;
    public static void main(String[] args)
    {
        final CountDownLatch startSignal = new CountDownLatch(1);
        final CountDownLatch doneSignal = new CountDownLatch(NTHREADS);
        Runnable r = new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    report("entered run()");
                    startSignal.await(); // wait until told to ...
                    report("doing work"); // ... proceed
                    Thread.sleep((int) (Math.random() * 1000));
                    doneSignal.countDown(); // reduce count on which
                    // main thread is ...
                } // waiting
                catch (InterruptedException ie)
                {
                System.err.println(ie);
                }
            }

            void report(String s)
            {
            System.out.println(System.currentTimeMillis() +
            ": " + Thread.currentThread() +            ": " + s);
            }
        };

        ExecutorService executor = Executors.newFixedThreadPool(NTHREADS);
        for (int i = 0; i < NTHREADS; i++)
            executor.execute(r);
            try
            {
                System.out.println("main thread doing something");
                Thread.sleep(1000); // sleep for 1 second
                startSignal.countDown(); // let all threads proceed
                System.out.println("main thread doing something else");
                doneSignal.await(); // wait for all threads to finish
                executor.shutdownNow();
            }
            catch (InterruptedException ie)
            {
            System.err.println(ie);
            }
    }
}
时间: 2024-11-06 15:16:03

java CountDownLatch的相关文章

Java CountDownLatch解析(上)

写在前面的话 最近一直在边工作边学习分布式的东西,看到了构建Java中间件的基础知识,里面有提到Java多线程并发的工具类,例如ReentrantLock.CyclicBarrier.CountDownLatch... 以前在工作中也有用到过这些实用的工具类,但是了解不是特别深入,借此机会打个卡,好记性不如烂博客,哈哈哈... CountDownLatch简介 CountDownLatch顾名思义,count + down + latch = 计数 + 减 + 门闩(这么拆分也是便于记忆=_=)

java countDownLatch 线程辅助类

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 package aaa.bbb; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CountDownLatch; pu

java CountDownLatch 使用介绍

CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下.CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行.例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行.CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的

Java --CountDownLatch简介

CountDownLatch 1.类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞.之后,会释放所有等待的线程,await 的所有后续调用都将立即返回.这种现象只出现一次——计数无法被重置. 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行 2.使用场景 在 一些应用场合中,需要等待某个条

Java CountDownLatch解析(下)

写在前面的话 在上一篇CountDownLatch解析中,我们了解了CountDownLatch的简介.CountDownLatch实用场景.CountDownLatch实现原理中的await()方法, 接下来我们接着来了解它的countDown()方法以及它的示例和优缺点. CountDownLatch实现原理 二.CountDownLatch.countDown() 关于同步队列那点事 当部分线程调用await()方法后,它们在同步队列中被挂起,然后自省的检查自己能否满足醒来的条件(还记得那

java CountDownLatch类的使用

CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则处于等待状态,调用countDown()方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行. 主要方法 public CountDownLatch(int count); public void countDown(); public void await() throws InterruptedException 以下举例

java CountDownLatch 控制异步和同步

应用场景举例: 执行A项目的方法,需要调用B项目.C项目.D项目的接口方法. 需求: 异步调用B.C.D项目的接口方法,且每个接口都调用结束后,A项目的方法才可以结束. 注:如果需要获取接口返回结果,可以使用缓存(key,value)保存.线程只支持线程外的静态参数传递,不严谨. package com.sze.redis.async; import java.util.concurrent.CountDownLatch; public class AsyncTest { public stat

Java CountDownLatch 使用与案例测试

一.CountDownLatch介绍: * CountDownLatch是一种java.util.concurrent包下一个同步工具类; * CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行. * public void countDown() 锁存器的计数减1; * public boolean await(long timeout,TimeUnit unit) 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间. 二.应用

Java并发编程-关卡

CyclicBarrier 直译过来叫循环栅栏,它主要的方法就是一个:await().await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程.当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行.在这之后,如果再次调用 await() 方法,计数就又会变成 N-1,新一轮重新开始,这便是 Cyclic 的含义所在. CyclicBarrier 的使用并不难,但需要主要它所相关的异常.除了常见的异常,CyclicBarrier.await() 方法会抛