Java并发系列5

今天讲一个倒计时器工具,叫CountDownLatch。需要这个工具的场景大概有:当所有的小任务都完成之后,再启动大任务。
先看代码:

1public class CountDownLatchDemo { 2 static final CountDownLatch LATCH = new CountDownLatch(10); 3 4 public static class Task implements Runnable { 5 final static AtomicInteger incr = new AtomicInteger(); 6 7 @Override 8 public void run() { 9 try { 10 Thread.sleep(new Random().nextInt(10)*100); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 System.out.println("火箭检测任务-" + incr.getAndIncrement() + " 完成"); 15 LATCH.countDown(); 16 } 17 18 } 19 20 public static void main(String[] args) throws InterruptedException { 21 ExecutorService executorService = Executors.newFixedThreadPool(10); 22 for (int i = 0; i < 10; i++) { 23 executorService.execute(new Task()); 24 } 25 LATCH.await(); 26 System.out.println("发射火箭"); 27 executorService.shutdown(); 28 } 29}

这里模拟了火箭发射的场景,所有预备任务完成,才能发射火箭。
CountDownLatch比较简单,一个构造加上两个主要方法:

  • 构造函数需要入参一个总数,表示有几个小任务需要执行
  • countDown() 每次执行完小任务都要调用这个方法,用来倒计时
  • await() 没有倒计时到0,就会一直阻塞。当倒计时完成,则继续执行后续代码
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java并发编程之二

CountDownLatch类  允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。  CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后在

java并发中CountDownLatch的使用

java并发中CountDownLatch的使用在java并发中,控制共享变量的访问非常重要,有时候我们也想控制并发线程的执行顺序,比如:等待所有线程都执行完毕之后再执行另外的线程,或者等所有线程都准备好了才开始所有线程的执行等。这个时候我们就可以使用到CountDownLatch。简单点讲,CountDownLatch存有一个放在QueuedS

Go Context 并发编程简明教程

1为什么需要ContextWaitGroup和信道(channel)是常见的2种并发控制的方式。如果并发启动了多个子协程,需要等待所有的子协程完成任务,WaitGroup非常适合于这类场景,例如下面的例子:varwgsync.WaitGroupfuncdoTask(nint){time.Sleep(time.Durat

一行一行源码分析清楚AbstractQueuedSynchronizer

在分析Java并发包java.util.concurrent源码的时候,少不了需要了解AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是Java并发包的基础工具类,是实现ReentrantLock、CountDownLatch、Semaphore、FutureTask等类的基础。Google一下A

Java并发基础05. 传统线程同步通信技术

先看一个问题:有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次……如此往返执行50次。看完这个问题,很明显要用到线程间的通信了,先分析一下思路:首先肯定要有两个线程,然后每个线程中肯定有个50次的循环,因为每个线程都要往返执行任务50次,主线程的任务是执行5次,子线程的任务是执行10次。线程间通信