`

并发:CountDownLatch的使用

 
阅读更多
CountDownLatch:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。与CyclicBarrier非常类似。但CountDownLatch的计数器只能使用一次,而CyclicBarrier可以循环使用。
主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
示例(来自《Think In Java》,稍有改动):注意latch.await()的位置

class TaskPortion implements Runnable{
	private static int counter = 0;
	private final int id = counter++;
	private static Random rand = new Random(47);
	private final CountDownLatch latch;
	
	TaskPortion(CountDownLatch latch){
		this.latch = latch;
	}
	@Override
	public void run() {
		try {
			doWork();
			latch.countDown();
//			latch.await();不要写在这儿,这样不能体现 CountDownLatch 的作用
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	public void doWork() throws InterruptedException{
		TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));
		System.out.println(this + "completed!");
	}
	public String toString(){
		return String.format("%1$-3d", id);
	}
}

public class CountDownLatchDemo {
	static final int SIZE = 13;
	public static void main(String[] args) throws InterruptedException{
		ExecutorService exec = Executors.newCachedThreadPool();
		CountDownLatch latch = new CountDownLatch(SIZE);
		for(int i = 0; i < SIZE; i++){
			exec.execute(new TaskPortion(latch));
		}
		latch.await();//写这儿比较合适
		System.out.println("Launched all tasks");
		exec.shutdown();
	}
}

输出:
11 completed!
7  completed!
9  completed!
10 completed!
5  completed!
8  completed!
12 completed!
1  completed!
2  completed!
6  completed!
4  completed!
0  completed!
3  completed!
Launched all tasks
分享到:
评论

相关推荐

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...

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

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

    并发编程之CountDownLatch

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

    Java并发程序设计教程

    7、并发流程控制手段:CountDownlatch、Barrier 8、定时器: ScheduledExecutorService、大规模定时器TimerWheel 9、并发三大定律:Amdahl、Gustafson、Sun-Ni 10、神人和图书 11、业界发展情况: GPGPU、OpenCL 12、...

    Java编程并发程序设计

    7、并发流程控制手段:CountDownlatch、Barrier 8、定时器: ScheduledExecutorService、大规模定时器TimerWheel 9、并发三大定律:Amdahl、Gustafson、Sun-Ni 10、神人和图书 11、业界发展情况: GPGPU、OpenCL 12、...

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

    本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...

    CountDownLatch学习用法

    5. **一次性使用**:CountDownLatch的设计是一次性的,即一旦计数器归零,就不能再次使用。如果尝试再次调用`await()`或`countDown()`,它将抛出`IllegalStateException`。 6. **并发性能**:由于CountDownLatch是...

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

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

    CountDownLatch同步工具类使用详解

    1. 创建CountDownLatch对象:使用new关键字创建一个CountDownLatch对象,并指定线程的数量。 2. 等待线程执行完成:使用await()方法使得当前线程等待其他线程执行完成。 3. 唤醒阻塞线程:使用countDown()方法使得...

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...

    Java并发编程:设计原则与模式(第二版)-3

    10. **并发编程最佳实践**:书中总结了在实际开发中应遵循的并发编程最佳实践,如最小化共享状态、避免阻塞、使用并发工具而非同步原语等。 通过对这些知识点的深入理解和应用,开发者可以编写出高效、安全的并发...

    基础技术部牛路《Java多线程入阶分享》纯干货

    Java多线程入阶干货分享 1.使用线程的经验:设置名称、响应中断、...7.并发流程控制手段:CountDownLatch、Barrier 8.定时器:ScheduledExecutorService、大规模定时器TimerWheel 9.并发三大定律 10.图书、相关网络资源

    CountDownLatch练习

    2. **如何避免死锁与饥饿**:在使用CountDownLatch时,要确保所有线程都能正确调用`countDown()`,避免因某个线程异常而无法达到零导致死锁。 3. **如何选择合适的同步工具**:根据场景选择,如果需要所有线程执行完...

    java并发编程:设计原则与模式.rar

    Java并发工具类库(java.util.concurrent)是并发编程中的另一个重要主题,包括Atomic类(提供原子操作)、Semaphore(信号量)、CountDownLatch(计数器门锁)、CyclicBarrier(循环栅栏)和Exchanger(交换器)等...

    CountDownLatch和CyclicBarrier用法实例大全

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

    Java并发编程:设计原则与模式(第二版)-3PDF

    - **并发测试**:使用工具如JMeter进行并发性能测试,找出瓶颈。 以上知识点构成了《Java并发编程:设计原则与模式(第二版)》的主要内容,通过学习和实践这些知识,开发者可以更好地设计和实现高并发、高性能的...

    CountDownLatch Demo

    - **并发任务分阶段执行**:一个大型任务可以被分解成多个子任务,使用 CountDownLatch 让所有子任务完成后,再执行下一步操作。 5. **注意事项**: - `CountDownLatch` 不是线程安全的,因此计数器一旦递减到零...

    多线程countDownLatch方法介绍

    本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始化时设定一个初始值,通常表示一个任务的子任务数量。每个线程完成其工作后会调用`countDown()`方法,...

Global site tag (gtag.js) - Google Analytics