案例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(); } }
相关推荐
`CountDownLatch` 是一个同步辅助类,它允许一个或多个线程等待其他线程完成指定次数的操作。一旦计数到达零,所有等待的线程都会被释放。它通常用于初始化阶段,让所有线程等待某个任务完成后再继续执行。 8. `...
Java的`java.util.concurrent`包提供了一个名为`CountDownLatch`的工具类,它允许我们同步多个线程并计算它们的执行时间。`CountDownLatch`在JDK 1.5中引入,主要用于解决线程间的等待和同步问题。 `CountDownLatch...
java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对CountDownLatch和CyclicBarrier的使用场景和实现进行详细的介绍。 ...
4. **并发控制**:Java并发库(java.util.concurrent包)提供了一些工具类,如Semaphore(信号量)、CountDownLatch(计数器门锁)和CyclicBarrier(回环栅栏)等,可以帮助我们控制线程的并发执行。 5. **线程间...
另外,Java 1.5还引入了一些高级同步工具,如**Semaphore**(信号量),用于控制同时访问特定资源的线程数量;**CyclicBarrier**(循环屏障)让一组线程等待其他线程到达一个公共屏障点,常用于多线程协作;**...
它是一个一次性使用的同步辅助工具,可以通过`await()`方法阻塞当前线程,直到所有计数器减到0。 - **CyclicBarrier**:让一组线程在预定义的执行点进行等待,当所有线程到达这个点时,它们会被同时释放继续执行。 -...
5. **并发工具类**: - **CountDownLatch**:可能被用来确保所有线程完成特定操作后,比赛才能结束。在龟兔赛跑的例子中,可以设置一个计数器为2(代表龟和兔),每只动物到达终点时减一,直到计数器归零。 - **...
- `Semaphore`和`CountDownLatch`:信号量和计数器,用于线程控制。 通过这个手机版的JDK 1.6.0_2 API文档,开发者可以在移动设备上随时查阅这些关键知识点,提高开发效率,更好地理解和利用Java的强大功能。无论...
此外,Java还提供了Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器门锁)和Phaser(阶段器)等高级同步工具,以应对更复杂的并发场景。 线程的状态包括新建、就绪、运行、阻塞和终止,...
- **`CountDownLatch`**:一次性使用的同步工具类,当计数器减为零时,所有等待的线程被释放。`CountDownLatch`不可重置。 #### 8. Java内存模型概述 Java内存模型(JMM)定义了程序中各种变量(线程共享变量)的...
再者,多线程编程是Java的一个强项,线程同步、锁机制(如synchronized关键字、Lock接口)和并发工具类(如Semaphore、CountDownLatch)的学习,将帮助你编写高效、安全的并发程序。 此外,JDK还包含了一些高级特性...
- **实现**:基于AQS的Sync抽象类,使用一个计数器,每次调用countDown()方法,计数器减一,所有await()的线程会检查计数器是否为零,为零则唤醒所有线程。 6. **CyclicBarrier(循环屏障)**: - **设计思想**:...
`CountDownLatch`是一个同步辅助类,允许一个或多个线程等待其他线程完成操作。初始化时设置一个计数器,每当计数器递减至零时,等待的线程才会被唤醒。 **2.4.2 `CyclicBarrier`** `CyclicBarrier`也是一个同步...
6. **同步工具:`CyclicBarrier`与`CountDownLatch`**: - `CyclicBarrier`允许一组线程等待其他线程到达某个点后一起继续,可以重复使用。 - `CountDownLatch`则是一次性的,一旦计数器归零,就不能再重置,常...
- 同步工具类如 `Semaphore`、`CyclicBarrier` 和 `CountDownLatch` 提供了更高级别的同步机制,使得开发人员能够更方便地管理多线程间的同步问题。 - 这些类可以用来解决常见的多线程编程问题,比如资源池管理和...
此外,还有Semaphore(信号量)、CountDownLatch(倒计时门锁)和CyclicBarrier(回环栅栏)等高级并发工具类,它们可以帮助开发者更方便地管理和协调线程间的操作。 其次,Java类加载器是Java运行时环境的重要组成...
"并发工具类"如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(计数器门锁)和Exchanger(交换器)等,为复杂并发场景提供了便利。这些工具可以帮助开发者更灵活地控制线程间的协作和同步,提高...