`

jdk1.5——CountdownLatch(计数器线程工具同步类)

 
阅读更多

 

 

案例1: 100米田径中,裁判员1鸣枪后,运动员跑,后所有运动员到达终点,裁判员2统计结果:

 

package thread;

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

/**
 * 执行结果:
 * 倒计时3秒
倒计时2秒
倒计时1秒
裁判员1鸣枪
运动员pool-1-thread-2 begin run
运动员pool-1-thread-4 begin run
运动员pool-1-thread-5 begin run
运动员pool-1-thread-3 begin run
运动员pool-1-thread-2 end run
运动员pool-1-thread-4 end run
运动员pool-1-thread-5 end run
运动员pool-1-thread-3 end run
裁判员2pool-1-thread-6统计完结果
 * @author zm
 *
 */
public class CountDownLatchTest2 {

	/**
	 * 裁判员1发令结束
	 * 运动员1,2,3,4开始跑
	 * 裁判员2在运动员都跑到终点后,统计名词
	 * ------> 执行阶段性任务
	 */
	public static void main(String[] args) {

		// 因为有三个阶段任务,因此需要两个阶段任务间隔计数器
		final CountDownLatch countDownLatch1 = new CountDownLatch(1);
		final CountDownLatch countDownLatch2 = new CountDownLatch(4);
		
		ExecutorService service = Executors.newCachedThreadPool();  
		
		//0 裁判员线程
		service.execute(new Runnable() {
			@Override
			public void run() {
				for(int i=3; i>=1; i--){
					try {
						TimeUnit.SECONDS.sleep(1);
						System.out.println("倒计时" + i + "秒");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println("裁判员1鸣枪");
				countDownLatch1.countDown();
			}
		});
		
	
		// 1 4个运动员线程
		for(int i=0; i<4; i++){
			Runnable runnable = new Runnable() {
				@Override
				public void run() {
					try {
						countDownLatch1.await();
						System.out.println("运动员" + Thread.currentThread().getName() + " begin run");
						TimeUnit.SECONDS.sleep(new Random().nextInt(3));
						System.out.println("运动员" + Thread.currentThread().getName() + " end run");
						countDownLatch2.countDown();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
			};
			service.execute(runnable);
		}
		
		// 2 裁判员统计结果
		service.execute(new Runnable() {
			@Override
			public void run() {
				try {
					countDownLatch2.await();
					System.out.println("裁判员2" + Thread.currentThread().getName() + "统计完结果");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
		});
	 	
	}

}

 

 

 

 

package cn.itcast.heima2;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 计数器线程工具同步类
 * @author zm
 * 
 * 线程pool-1-thread-1正准备接受命令
线程pool-1-thread-2正准备接受命令
线程pool-1-thread-3正准备接受命令
线程main即将发布命令
线程main已发送命令,正在等待结果
线程pool-1-thread-1已接受命令
线程pool-1-thread-2已接受命令
线程pool-1-thread-3已接受命令
 *
 */
public class CountdownLatchTest {

	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final CountDownLatch cdOrder = new CountDownLatch(1);
		final CountDownLatch cdAnswer = new CountDownLatch(3);		
		for(int i=0;i<3;i++){
			Runnable runnable = new Runnable(){
					public void run(){
					try {
						System.out.println("线程" + Thread.currentThread().getName() + 
								"正准备接受命令");						
						cdOrder.await();
						System.out.println("线程" + Thread.currentThread().getName() + 
						"已接受命令");								
						Thread.sleep((long)(Math.random()*10000));	
						System.out.println("线程" + Thread.currentThread().getName() + 
								"回应命令处理结果");						
						cdAnswer.countDown();						
					} catch (Exception e) {
						e.printStackTrace();
					}				
				}
			};
			service.execute(runnable);
		}		
		try {
			Thread.sleep((long)(Math.random()*10000));
		
			System.out.println("线程" + Thread.currentThread().getName() + 
					"即将发布命令");						
			cdOrder.countDown();
			System.out.println("线程" + Thread.currentThread().getName() + 
			"已发送命令,正在等待结果");	
			cdAnswer.await();
			System.out.println("线程" + Thread.currentThread().getName() + 
			"已收到所有响应结果");	
		} catch (Exception e) {
			e.printStackTrace();
		}				
		service.shutdown();

	}
}

 

 

分享到:
评论

相关推荐

    jdk1.5并发新特性.

    `CountDownLatch` 是一个同步辅助类,它允许一个或多个线程等待其他线程完成指定次数的操作。一旦计数到达零,所有等待的线程都会被释放。它通常用于初始化阶段,让所有线程等待某个任务完成后再继续执行。 8. `...

    计算多线程环境下执行任务时间1

    Java的`java.util.concurrent`包提供了一个名为`CountDownLatch`的工具类,它允许我们同步多个线程并计算它们的执行时间。`CountDownLatch`在JDK 1.5中引入,主要用于解决线程间的等待和同步问题。 `CountDownLatch...

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

    java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对CountDownLatch和CyclicBarrier的使用场景和实现进行详细的介绍。 ...

    Multi person chat_jdk1.8_java编程_

    4. **并发控制**:Java并发库(java.util.concurrent包)提供了一些工具类,如Semaphore(信号量)、CountDownLatch(计数器门锁)和CyclicBarrier(回环栅栏)等,可以帮助我们控制线程的并发执行。 5. **线程间...

    Android多线程全新讲解[整理].pdf

    另外,Java 1.5还引入了一些高级同步工具,如**Semaphore**(信号量),用于控制同时访问特定资源的线程数量;**CyclicBarrier**(循环屏障)让一组线程等待其他线程到达一个公共屏障点,常用于多线程协作;**...

    第20章 Part4 并发工具同步器.pdf

    它是一个一次性使用的同步辅助工具,可以通过`await()`方法阻塞当前线程,直到所有计数器减到0。 - **CyclicBarrier**:让一组线程在预定义的执行点进行等待,当所有线程到达这个点时,它们会被同时释放继续执行。 -...

    简单的龟兔赛跑,运用多线程,在jdk8编写.zip

    5. **并发工具类**: - **CountDownLatch**:可能被用来确保所有线程完成特定操作后,比赛才能结束。在龟兔赛跑的例子中,可以设置一个计数器为2(代表龟和兔),每只动物到达终点时减一,直到计数器归零。 - **...

    JDK1.6.02 API文档 手机版(全)

    - `Semaphore`和`CountDownLatch`:信号量和计数器,用于线程控制。 通过这个手机版的JDK 1.6.0_2 API文档,开发者可以在移动设备上随时查阅这些关键知识点,提高开发效率,更好地理解和利用Java的强大功能。无论...

    java线程入门(内附详细的开发环境讲解)

    此外,Java还提供了Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器门锁)和Phaser(阶段器)等高级同步工具,以应对更复杂的并发场景。 线程的状态包括新建、就绪、运行、阻塞和终止,...

    Java并发编程-并发编程知识点总结.docx

    - **`CountDownLatch`**:一次性使用的同步工具类,当计数器减为零时,所有等待的线程被释放。`CountDownLatch`不可重置。 #### 8. Java内存模型概述 Java内存模型(JMM)定义了程序中各种变量(线程共享变量)的...

    Java深度历险-让你了解JDK

    再者,多线程编程是Java的一个强项,线程同步、锁机制(如synchronized关键字、Lock接口)和并发工具类(如Semaphore、CountDownLatch)的学习,将帮助你编写高效、安全的并发程序。 此外,JDK还包含了一些高级特性...

    基于JDK源码解析Java领域中的并发锁,我们需要特别关注哪些内容?

    - **实现**:基于AQS的Sync抽象类,使用一个计数器,每次调用countDown()方法,计数器减一,所有await()的线程会检查计数器是否为零,为零则唤醒所有线程。 6. **CyclicBarrier(循环屏障)**: - **设计思想**:...

    java的concurrent用法详解

    `CountDownLatch`是一个同步辅助类,允许一个或多个线程等待其他线程完成操作。初始化时设置一个计数器,每当计数器递减至零时,等待的线程才会被唤醒。 **2.4.2 `CyclicBarrier`** `CyclicBarrier`也是一个同步...

    50 道Java 线程面试题(经典)

    6. **同步工具:`CyclicBarrier`与`CountDownLatch`**: - `CyclicBarrier`允许一组线程等待其他线程到达某个点后一起继续,可以重复使用。 - `CountDownLatch`则是一次性的,一旦计数器归零,就不能再重置,常...

    Java Concurrency Framework 的介绍

    - 同步工具类如 `Semaphore`、`CyclicBarrier` 和 `CountDownLatch` 提供了更高级别的同步机制,使得开发人员能够更方便地管理多线程间的同步问题。 - 这些类可以用来解决常见的多线程编程问题,比如资源池管理和...

    Java基础知识

    此外,还有Semaphore(信号量)、CountDownLatch(倒计时门锁)和CyclicBarrier(回环栅栏)等高级并发工具类,它们可以帮助开发者更方便地管理和协调线程间的操作。 其次,Java类加载器是Java运行时环境的重要组成...

    实战Java高并发程序设计.mobi.azw3.epub

    "并发工具类"如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(计数器门锁)和Exchanger(交换器)等,为复杂并发场景提供了便利。这些工具可以帮助开发者更灵活地控制线程间的协作和同步,提高...

Global site tag (gtag.js) - Google Analytics