线程中的同步辅助类CountDownLatch

简介:

四个类可协助实现常见的专用同步语句。Semaphore 是一个经典的并发工具。CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。

 

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

 

等待其他线程:CountDownLatch(其实就是个倒序计数器)

         当其他线程完成之前,该类线程一直处于等待状态.

 

场景需求:

起点裁判倒计时....之后 运动员起跑,然后终点裁判发布成绩.

要让起点裁判线程优先执行.

老师开始给出了一个线程的join方法可以实现这个需求. t.join(); // 优先执行当前线程

但是join不好,因为如果t对应的线程不执行完,其他的所有线程都不会被执行到.

 

可以使用CountDownLatch.

final CountDownLatch cdl1 = new CountDownLatch(1);

刚开始让4个运动员线程处于等待状态,然后判断,有一个计数器int i = 1,裁判线程获得这个计数器.

裁判执行完对应的代码之后,把i变成0,如果运动员获得i=0,就开始执行.

 

要等到最后一个运动员线程执行完,终点裁判宣布成绩.

定义一个初始值是4的计数器,有个运动员到终点就减去1(cdl1.countDown();// 计数器减1).

 

cdl2.await();// 等待计数器变为0

 

CountDownLatchDemo.java

复制代码
 1 import java.util.Random;
 2 import java.util.concurrent.CountDownLatch;
 3 import java.util.concurrent.TimeUnit;
 4 
 5 public class CountDownLatchDemo {
 6 
 7     public static void main(String[] args) throws InterruptedException {
 8         final CountDownLatch cdl1 = new CountDownLatch(1);
 9         final CountDownLatch cdl2 = new CountDownLatch(4);
10 
11         // t.join(); // 优先执行当前线程
12 
13         for (int i = 0; i < 4; i++) {
14             new Thread(new Runnable() {// 运动员
15 
16                         @Override
17                         public void run() {
18                             try {
19                                 cdl1.await(); // 等待计数器变为0
20 
21                                 System.out.println(Thread.currentThread()
22                                         .getName() + " : 起跑");
23                                 TimeUnit.SECONDS.sleep(new Random().nextInt(3));
24                                 System.out.println(Thread.currentThread()
25                                         .getName() + " : 到达终点!");
26                                 cdl2.countDown();
27                             } catch (InterruptedException e) {
28                                 e.printStackTrace();
29                             }
30                         }
31                     }).start();
32         }
33 
34         Thread t = new Thread(new Runnable() {// 发布命令的裁判
35 
36                     @Override
37                     public void run() {
38                         System.out.println("准备");
39                         for (int i = 3; i >= 1; i--) {
40                             System.out.println(i + "...");
41                             try {
42                                 TimeUnit.SECONDS.sleep(1);
43                             } catch (InterruptedException e) {
44                                 e.printStackTrace();
45                             }
46                         }
47                         System.out.println("跑!");
48                         cdl1.countDown();// 计数器减1
49 
50                     }
51                 });
52         t.start();
53         
54         new Thread(new Runnable() {// 宣布成绩的裁判
55 
56             @Override
57             public void run() {
58                 try {
59                     cdl2.await();// 等待计数器变为0
60                 } catch (InterruptedException e) {
61                     e.printStackTrace();
62                 }
63                 System.out.println("宣布成绩!");
64             }
65         }).start();
66         
67     }
68 }
复制代码

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6206247.html,如需转载请自行联系原作者

相关文章
|
8月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
356 0
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
277 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 1
【JavaEE】——多线程常用类
Callable的call方法,FutureTask类,ReentrantLock可重入锁和对比,Semaphore信号量(PV操作)CountDownLatch锁存器,
|
Java 程序员 调度
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
创建线程的五种方式,Thread常见方法(守护进程.setDaemon() ,isAlive),start和run方法的区别,如何提前终止一个线程,标志位,isinterrupted,变量捕获
|
安全 Java API
【JavaEE】多线程编程引入——认识Thread类
Thread类,Thread中的run方法,在编程中怎么调度多线程
|
5月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
244 6
|
8月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
396 83
|
10月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
389 0
|
5月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
510 0

热门文章

最新文章