CountDownLatch同步工具类的使用

同步工具类的使用大大方便了多线程并发的操作。CountDownLatch 是一个 java.util.concurrent下的同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。这种需求如果使用基本的线程通信来操作的确过于繁琐。使用CountDownLatch工具类大大提高了这类问题情形的工作效率。

例如有10个线程,要求主线程必须在其他9个线程全部执行完后才执行,不进行任何操作,执行结果肯定是杂乱无序的:

 1 import java.util.concurrent.CountDownLatch;
 2
 3 public class CountDownLatchDemo {
 4     public static void main(String[] args) {
 5       for (int i=0;i<9;i++) {
 6           new Thread(()->{
 7               System.out.println(Thread.currentThread().getName()+"运行!");
 8               },"线程"+String.valueOf(i)).start();
 9       }
10         System.out.println("main线程结束!!!");
11     }
12 }

使用CountDownLatch工具类,及使用方法:

 1 import java.util.concurrent.CountDownLatch;
 2
 3 public class CountDownLatchDemo {
 4     public static void main(String[] args) throws InterruptedException {
 5         CountDownLatch countDownLatch=new CountDownLatch(9);
 6       for (int i=0;i<9;i++) {
 7           new Thread(()->{
 8               System.out.println(Thread.currentThread().getName()+"运行!");
 9               countDownLatch.countDown();
10               },"线程"+String.valueOf(i)).start();
11       }
12       countDownLatch.await();
13         System.out.println("main线程结束!!!");
14     }
15 }

原理:

* CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞

* 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)

* 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行

了解更多:

https://www.cnblogs.com/nullzx/p/5272807.html

ps:自定义模板代码,将代码块抽取成快捷键的方法:

https://blog.csdn.net/zhou520yue520/article/details/82713820

原文地址:https://www.cnblogs.com/fangtingfei/p/12021145.html

时间: 2024-10-15 15:17:30

CountDownLatch同步工具类的使用的相关文章

深入分析同步工具类之CountDownLatch

概览: CountDownLatch又称闭锁,其作用是让一个或者多个线程挂起,直到其他的线程执行完后恢复挂起的线程,使其继续执行.内部维护着一个静态内部类Sync,该类继承AbstractQueuedSynchronizer(这个类之前分析过了,参见    深入分析同步工具类之AbstractQueuedSynchronizer),Sync实例维护着state属性,调用await()方法,使当前线程挂起,当一个线程执行完后,调用countDown()方法,state-1,直到state变为0,被

【同步工具类】CountDownLatch模拟任务同步

[同步工具类]CountDownLatch闭锁任务同步 转载:https://www.cnblogs.com/yangchongxing/p/9214284.html 打过dota的同学都知道,多人一起在线打游戏,每个人的电脑性能不同,所以加载游戏需要的时间也是不同的,只有等大家都加载完成了,游戏才能开始玩,我们就模拟这个过程. 游戏 package concurrent; import java.util.Random; import java.util.concurrent.CountDow

同步工具类 CountDownLatch 和 CyclicBarrier

在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解 线程的 wait() notify() notifyall() 方法 线程异步返回 Future ThreadLocal 类 线程池 ThreadPoolExecutor 同步工具类 CountDownLatch,CyclicBarrier,Semaphore,Phaser,Exchanger 估计上面每一个对于 2~3 年的 java 同学来说都是恶梦,比较难以理解,本文

JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore

在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLatch 先看一下,CountDownLatch 源码的官方介绍. 意思是,它是一个同步辅助器,允许一个或多个线程一直等待,直到一组在其他线程执行的操作全部完成. public CountDownLatch(int count) { if (count < 0) throw new IllegalAr

《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&amp;并发容器类&amp;同步工具类,消费者模式

上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Hashtable,此外还包括在JDK1.2中添加的一些功能相似的类,这些同步的封装器类由Collections.synchronizedXxx等工厂方法创建的.这些类实现线程安全的方式是:将他们的状态封装起来,并对每个共有方法都进行同步,使得每次只能有一个线程能访问容器的状态. 关于java中的Vect

Java 并发编程(四)常用同步工具类

同步工具类可以使任何一种对象,只要该对象可以根据自身的状态来协调控制线程的控制流.阻塞队列可以作为同步工具类,其他类型的同步工具类还包括:信号量(Semaphore).栅栏(Barrier)以及闭锁(Latch). 闭锁 首先我们来介绍闭锁. 闭锁作用相当于一扇门:在闭锁到达某一状态之前,这扇门一直是关闭的,所有的线程都会在这扇门前等待(阻塞).只有门打开后,所有的线程才会同时继续运行. 闭锁可以用来确保某些活动直到其它活动都完成后才继续执行,例如: 1.确保某个计算在其所有资源都被初始化之后才

同步工具类

1.CountDownLatch 作用:使一个或多个线程等待一组事件发生. 包括一个计数器,初始化为一个正数,表示需要等待的事件数量. countDown方法递减计数器,表示有一个事件已经发生了. await方法等待计数器为零,这表示所有需要等待的事件都已经发生. public class TestHarness { public long timeTasks(int nThreads, final Runnable task) throws InterruptedException { fin

Java并发(基础知识)——显示锁和同步工具类

显示锁                                                                                     Lock接口是Java 5.0新增的接口,该接口的定义如下: public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long

JAVA 并发编程-线程同步工具类(十二)

本文主要介绍一些java线程同步工具类,并不进行具体讲解,当有需要时,可以再去结合实例学习. 信号灯(Semaphore) 应用场景举例: 例如公司的打卡系统,如果有一个打卡机,那么一次就只能有一个人打卡,其余的人就被阻塞住,打卡完以后就可由下一个人打卡.如果有3个打卡机,那么一次就允许3个人或者少于三个人打卡,其余的人就得等待打卡机空闲下来才能继续打卡. 结果: 已进入1个线程,还可进入2个 已进入2个线程,还可进入1个 已进入3个线程,还可进入0个 空余出1个 已进入4个线程,还可进入0个