`
chenzehe
  • 浏览: 538202 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

同步工具类之CountDownLatch倒数计数器

 
阅读更多

   CountDownLatch类在java.util.concurrent包下,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行。这直接通过代码来说明CountDownLatch的作用,可以实现一个人(也可以是多个人)等待其他所有人都来通知他,这犹如一个计划需要多个领导都签字后才能继续向下实施,还可以实现一个人通知多个人的效果,类似裁判一声口令,运动员同时开始奔跑。

构造方法

public CountDownLatch(int count)构造一个用给定计数初始化的CountDownLatch。 

参数:
count - 在线程能通过 await() 之前,必须调用 countDown() 的次数 
抛出: IllegalArgumentException - 如果 count 为负

方法摘要

 void await() 
          使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。 
 boolean await(long timeout, TimeUnit unit) 
          使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。 
 void countDown() 
          递减锁存器的计数,如果计数到达零,则释放所有等待的线程。 
 long getCount() 
          返回当前计数。 
 String toString() 
          返回标识此锁存器及其状态的字符串。 

 

    用给定的计数 count 初始化 CountDownLatch 。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrierCountDownLatch 是一个通用同步工具,它有很多用途。将计数 1 初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 countDown() 的线程打开入口前,所有调用 await 的线程都一直在入口处等待。用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。CountDownLatch 的一个有用特性是,它不要求调用 countDown 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个 await,如下代码:

/**
 * Huisou.com Inc.
 * Copyright (c) 2011-2012 All Rights Reserved.
 */

package thread;

import java.util.concurrent.CountDownLatch;

/**
 * @description
 * 
 * @author chenzehe
 * @email hljuczh@163.com
 * @create 2013-1-10 下午08:24:52
 */

public class CountDownLatchTest {
	public static void main(String[] args) throws InterruptedException {
		int N = 10;
		CountDownLatch startSignal = new CountDownLatch(1);
		CountDownLatch doneSignal = new CountDownLatch(N);
		for (int i = 0; i < N; ++i) {
			new Thread(new Worker(startSignal, doneSignal)).start();
		}
		Thread.sleep(2000);
		System.out.println("before startSignal.countDown...");
		startSignal.countDown(); // let all threads proceed
		Thread.sleep(2000);
		System.out.println("finish startSignal.countDown...");
		doneSignal.await(); // wait for all to finish
		System.out.println("wait for all to finish...");
	}
}

class Worker implements Runnable {
	private final CountDownLatch	startSignal;
	private final CountDownLatch	doneSignal;
	
	Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
		this.startSignal = startSignal;
		this.doneSignal = doneSignal;
	}
	
	public void run() {
		try {
			System.out.println(Thread.currentThread().getName() + " come run method...");
			startSignal.await();
			doWork();
			doneSignal.countDown();
			System.out.println(Thread.currentThread().getName() + " left run method...");
		}
		catch (InterruptedException ex) {
		}
	}
	
	void doWork() {
		System.out.println(Thread.currentThread().getName() + " do work...");
	}
}

Thread-0 come run method...
Thread-1 come run method...
Thread-2 come run method...
Thread-4 come run method...
Thread-6 come run method...
Thread-8 come run method...
Thread-3 come run method...
Thread-5 come run method...
Thread-7 come run method...
Thread-9 come run method...
before startSignal.countDown...
Thread-0 do work...
Thread-0 left run method...
Thread-1 do work...
Thread-1 left run method...
Thread-2 do work...
Thread-2 left run method...
Thread-6 do work...
Thread-6 left run method...
Thread-4 do work...
Thread-4 left run method...
Thread-8 do work...
Thread-8 left run method...
Thread-3 do work...
Thread-3 left run method...
Thread-5 do work...
Thread-5 left run method...
Thread-7 do work...
Thread-7 left run method...
Thread-9 do work...
Thread-9 left run method...
finish startSignal.countDown...
wait for all to finish...
 

 它不阻塞线程的方法继续执行,所以上面一直打印come run method...,但是到wait方法的时候就阻塞了,等着主线程执行startSignal.countDown();因为startSignal的值count设置为1,所以只需要执行一次就会执行do work...,此时主线程中的doneSignal.await();方法已经被阻塞,只有等到doneSignalcount为0时才往下执行,也就是在子线程中执行了N次doneSignal.countDown();方法。

 

分享到:
评论

相关推荐

    利用 CountDownLatch 类实现线程同步

    Java 提供了多种工具来实现这样的同步机制,其中之一便是 `CountDownLatch` 类。`CountDownLatch` 是一个计数器,可以用于协调多个线程间的活动,等待所有线程完成各自的任务后,主线程或其他线程才能继续执行。 ...

    java并发工具类(CountDownLatch+Semaphore+Exchanger)

    Java并发工具类是Java并发编程中的重要组成部分,其中包括了多种实用的工具,如CountDownLatch、Semaphore和Exchanger,这些工具类极大地简化了多线程环境下的同步和协调问题。 1. **CountDownLatch**: ...

    CountDownLatch、Semaphore等4大并发工具类详解

    Phaser 是一个更加灵活的同步工具类,可以用来实现复杂的同步逻辑。Phaser 可以注册多个 partiecipants,每个 partiicipant 可以在 Phaser 中注册,Phaser 会等待所有 partiicipants 都执行完毕后,再执行下一步操作...

    浅谈java并发之计数器CountDownLatch

    CountDownLatch是Java并发编程中一个重要的工具类,用于协调多个线程间的同步。它通过一个计数器来控制线程的执行流程,使得一个或多个线程等待其他线程完成各自的任务后再继续执行。在创建CountDownLatch时,我们...

    CountDownLatch同步工具类使用详解

    CountDownLatch同步工具类使用详解 CountDownLatch是一个java.util.concurrent包下的同步工具类,它允许一个或多个线程等待直到在其他线程中一组操作执行完成。CountDownLatch的用法非常简单,它可以用来控制线程的...

    java.并发工具类CountDownLatch(处理方案示例).md

    java.并发工具类CountDownLatch(处理方案示例).md

    Java中CountDownLatch进行多线程同步详解及实例代码

    CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对CountDownLatch的详细解释和实例代码。 CountDownLatch的...

    多线程countDownLatch方法介绍

    在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...

    并发编程之CountDownLatch

    CountDownLatch 是一个同步的辅助类,它可以允许一个或多个线程等待,直到一组在其它线程中的操作执行完成。它通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就...

    Java concurrency之CountDownLatch原理和示例_动力节点Java学院整理

    CountDownLatch是Java并发编程中一个重要的工具类,用于协调多线程间的同步。它由Java并发包`java.util.concurrent`提供,主要用于解决一种场景:在主控线程等待多个子线程完成各自任务后再继续执行的情况。下面我们...

    CountDownLatch练习

    CountDownLatch是Java并发编程中一个重要的同步工具类,它允许一个或多个线程等待其他线程完成操作。这个工具在多线程环境下的并行处理和协调中扮演着关键角色。 **CountDownLatch是什么?** CountDownLatch是一个...

    Java并发包之CountDownLatch用法.docx

    `CountDownLatch`是Java并发包`java.util.concurrent`中的一个重要工具类,用于实现线程间的同步。它基于计数器的概念,初始化时设置一个非负的计数值,然后通过调用`countDown()`方法来递减这个计数器。主线程或...

    CountDownLatch和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

    CountDownLatch详解.docx

    CountDownLatch 是 Java 中的一个同步工具类,位于 `java.util.concurrent` 包下,它主要用于多线程间的协作,尤其在需要等待所有线程执行完指定任务后才能继续执行的情况。这个类通过一个计数器(计数down)来实现...

    CountDownLatch学习用法

    CountDownLatch是Java并发编程中一个重要的工具类,它属于java.util.concurrent包下的一个同步辅助类。这个类的设计目的是允许一个线程等待其他多个线程完成操作,然后再继续执行。CountDownLatch通常用于多线程协作...

    Java多线程编程之CountDownLatch同步工具使用实例

    在Java多线程编程中,CountDownLatch是一种常用的同步工具,用于协调多个线程之间的协作,确保它们按照特定的顺序执行或者等待所有线程完成特定任务后再继续执行。这个类是java.util.concurrent包的一部分,提供了...

    27 倒数计时开始,三、二、一—CountDownLatch详解.pdf

    CountDownLatch 是 Java 中一个强大的并发工具类,常用于线程间的协调与同步。它由 Java Concurrency Utilities (JCU) 包中的 `java.util.concurrent` 类库提供。CountDownLatch 的核心功能是允许一个或多个线程等待...

    countdownlatch-example-sourcecode.zip

    CountDownLatch是Java并发编程中一个非常重要的同步工具类,它在多线程协作场景中起到了关键的作用。在`countdownlatch-example-sourcecode.zip`这个压缩包中,我们可以看到一些关于CountDownLatch实际应用的示例...

    并发控制艺术:掌握CountDownLatch与Semaphore

    在这个领域,理解并正确使用同步工具,如CountDownLatch和Semaphore,是至关重要的。Semaphore(信号量)是一种广泛应用于控制对特定资源的线程访问数的工具。它基于许可的概念,允许多个线程在限制下同时访问资源,...

    Java并发编程之美_部分71

    CountDownLatch 是一个同步工具,它可以让一个线程等待其他线程完成某些操作后再继续执行。它的使用场景是当一个线程需要等待其他多个线程完成某些操作后再继续执行时。 CountDownLatch 的原理是使用 AQS...

Global site tag (gtag.js) - Google Analytics