`

java.util.concurrent 之五:倒计数的锁

    博客分类:
  • Java
阅读更多
    从名字可以看出,CountDownLatch是一个倒数计数的锁,当倒数到0时触发事件,也就是开锁,其他人就可以进入了。在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。


CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。

一个CountDownLatch实例是不能重复使用的,也就是说它是一次性的,锁一经被打开就不能再关闭使用了,如果想重复使用,请考虑使用CyclicBarrier。

下面的例子简单的说明了CountDownLatch的使用方法,模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下。当所有人都到达终点时,比赛结束。

同样,线程池需要显式shutdown。
package test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestCountDownLatch{
	public static void main(String[] args) throws InterruptedException{
		//开始的倒数锁
		final CountDownLatch begin=new CountDownLatch(1);
		//结束的倒数锁
		final CountDownLatch end=new CountDownLatch(10);
		//10名选手
		final ExecutorService exec=Executors.newFixedThreadPool(10);
		
		for(int index=0; index<10;index++){
			final int NO=index + 1;//Cannot refer to a non-final variable NO inside an inner class defined in a different method
			Runnable run=new Runnable(){
				public void run(){
					try{
						begin.await();//一直阻塞
						Thread.sleep((long)(Math.random() * 10000));
						System.out.println("No." + NO + " arrived");
					}catch(InterruptedException e){
					}finally{
						end.countDown();
					}
				}
			};
			exec.submit(run);
		}
		System.out.println("Game Start");
		begin.countDown();
		end.await();
		System.out.println("Game Over");
		exec.shutdown();
	}
}


可能的结果:
Game Start
No.4 arrived
No.6 arrived
No.8 arrived
No.5 arrived
No.10 arrived
No.3 arrived
No.2 arrived
No.7 arrived
No.1 arrived
No.9 arrived
Game Over


分享到:
评论

相关推荐

    java并发工具包 java.util.concurrent中文版-带书签版

    Java并发工具包(java.util.concurrent)是Java平台上用于高效、安全地处理多线程编程的重要组件。这个包包含了丰富的并发工具类,旨在帮助开发者构建高度并发的程序,提高程序的性能和可伸缩性。本资源是该工具包的...

    java多线程学习-java.util.concurrent详解(一) Latch/Barrier

    `java.util.concurrent`包是Java提供的一个强大的多线程工具库,其中包含了许多类和接口,如`CountDownLatch`和`CyclicBarrier`,它们为程序员提供了更高级别的同步和协调机制。这篇文档将详细解析这两个工具类的...

    java concurrent 包 详细解析

    2. **Executor框架**:`java.util.concurrent.Executor`是执行任务的核心接口,它定义了运行任务的方法。`ExecutorService`是Executor的一个子接口,提供了管理和控制执行器的额外功能,如`shutdown()`用于关闭执行...

    Java_JUC_Study:java.util.concurrent代码示例学习

    Java并发编程是Java开发中的重要领域,特别是在多线程应用中,`java.util.concurrent`(JUC)包提供了丰富的工具类和接口,帮助开发者高效、安全地管理并发任务。本项目"Java_JUC_Study"显然是一个针对这个关键包的...

    J.U.C系列线程安全的理论讲解编程开发技术共6页.pdf

    4. **`java.util.concurrent.atomic`和`java.util.concurrent.locks`包结合使用**:在某些场景下,原子变量和锁可以协同工作,提供更加高效和灵活的并发策略。 5. **`java.util.concurrent.CompletionService`和`...

    Java并发锁简介-动力节点共9页.pdf.zip

    4. ** 使用原子操作**: Java的`java.util.concurrent.atomic`包提供了许多原子类,它们在不使用锁的情况下保证操作的原子性。 以上是Java并发锁的基本知识,深入理解和熟练运用这些概念可以极大地提高多线程程序的...

    java的concurrent用法详解

    `Executor`框架是`java.util.concurrent`的核心组件之一,它为任务的执行提供了一个统一的接口。其中最重要的接口是`ExecutorService`,它定义了线程池的行为,使得我们可以将任务(`Runnable`或`Callable`对象)...

    java并发编程-构建块

    7. **并发工具类**:`java.util.concurrent`包包含了许多并发工具类,如`CountDownLatch`, `CyclicBarrier`, `Semaphore`等,它们用于协调多个线程间的协作,控制线程的启动、同步和计数。 8. **并发编程模式**:...

    倒计时程序JDK6.0

    JDK 6.0引入了`java.util.concurrent.TimeUnit`枚举,可以方便地进行不同时间单位之间的转换,如秒、毫秒等,这对于倒计时计数很有帮助。 2. **线程与并发**:倒计时通常需要在后台线程中运行,以不影响主程序的...

    代码行数统计器(Java写的)

    `java.util.concurrent`包提供了并发工具,如`ExecutorService`和`Future`,可以用于异步处理文件。 8. **性能优化**:对于大文件,一次性加载到内存可能导致内存不足。可以采用流式处理,只保留当前行的计数状态,...

    java 线程同步

    - `java.util.concurrent.locks.ReadWriteLock` 提供了读写锁,允许多个读线程同时访问,但写线程独占资源,提高了并发性能。 在`demoSynchrony.java`这个示例文件中,可能包含了上述一种或多种线程同步技术的实践...

    牛逼的java常用工具类

    3. **并发工具类**:`java.util.concurrent`包包含了许多用于多线程编程的工具类,如Semaphore(信号量)、ExecutorService(执行器服务)和CountDownLatch(计数下锁)。这些工具使得并发编程更加安全和高效。 4. ...

    基于UDP协议的数据包收发程序(代码+报告)Java

    `java.lang.Thread`或`java.util.concurrent.ExecutorService`可以帮助我们管理这些任务。 8. **异常处理**: UDP通信可能因网络问题或资源冲突而抛出异常。确保在发送、接收和关闭套接字时捕获并适当处理这些异常...

    java并发书籍xxxxxxx

    7. **并发集合**:Java的`java.util.concurrent`包提供了线程安全的集合,如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部处理了并发问题,避免了外部的同步操作。 8. **Executor框架**:Java 5引入的...

    eclipse网页访问.zip

    6. **线程安全**: 如果多个线程同时访问网页,为了确保计数的准确性,可能需要使用同步机制,如synchronized关键字或者java.util.concurrent包中的工具,来保证计数操作的线程安全。 7. **异常处理**: 在处理网络...

    J7CC:Examples in Java 7 Concurrency Cookbook, Java 7 并发编程实战手册

    9. **显式锁和条件**:`java.util.concurrent.locks.Lock`接口和`Condition`接口提供了比`synchronized`关键字更强大的锁定机制,如可中断的锁获取、可选择的公平性策略以及条件对象的分离。 10. **SwingWorker**:...

    java-multithreaded-programming.rar_java programming

    8. **并发工具类**:Java并发包(java.util.concurrent)提供了丰富的并发工具,如CountDownLatch用于线程间的计数同步,CyclicBarrier允许一组线程等待其他线程到达某个点后再继续,Semaphore控制并发访问数量等。...

    Java多线程编辑核心技术

    Java多线程是Java编程语言的重要特性之一,它允许开发者在单个程序中同时运行多个部分,这些部分可以并发执行。掌握Java多线程技术对于设计高效的并发程序、充分利用多核处理器资源、提高应用程序的执行效率至关重要...

    Java并发编程实践

    2. **同步机制**:Java提供了多种同步机制,包括`synchronized`关键字、`java.util.concurrent`包中的`Lock`接口及其实现,如`ReentrantLock`。它们用于防止多个线程同时访问共享资源,避免数据不一致性和竞态条件。...

    java 银行系统多线程

    5. **原子操作**:`java.util.concurrent.atomic`包提供了原子变量类,如`AtomicInteger`,可以实现非阻塞的线程安全操作,这对于银行系统的计数或余额更新等操作非常有用。 6. **死锁预防**:在设计多线程银行系统...

Global site tag (gtag.js) - Google Analytics