一 .概述
在前面我们时候说到了使用Condition实现线程的精确控制,但是我们在日常使用的时候我们发现我们的并发总是有一些规律.
比如在某些线程完成任务之后,该线程才开始,这样的场景总是并发场景中经常出现的.
为此,JUC提供了并发的辅助类帮助我们简化这种线程并发场景的实现.
二 . CountDownLatch
我们首先看一下这个类的结构:
构造函数:
public CountDownLatch(int count)
其中int值表示需要等待的信号量的数量.
public void countDown()
减少一个信号量,表示等待的线程的数量减少一.
public void await()
是线程阻塞,直到线程获取到足够的获取到足够的信号量.
总的来说,我们可以将CountDownLatch比作一个火箭发射器,信号数量不断减少,5,4,3,2,1.然后阻塞的线程就启动了.
三 . 实例演示
public class CountDownLathchTest { // public static void main(String[] args) { //创建了一个CountDownLatch,其中参数表示需要信号量的数量为10 CountDownLatch latch = new CountDownLatch(10); Thread thread = new Thread(new Runnable() { @Override public void run() { //定义的主线程阻塞了 try { latch.await(); System.out.println("我终于可以运行了.."); } catch (InterruptedException e) { e.printStackTrace(); } } }); thread.start(); //下面开启10个线程,每一个线程释放一个信号量. for(int x = 0 ; x<10;x++) { final int temp = x ; new Thread(()-> { try { TimeUnit.SECONDS.sleep(temp); } catch (InterruptedException e) { e.printStackTrace(); } //释放一个信号量 System.out.println(temp+"线程释放了信号量"); latch.countDown(); }) .start(); } } }
我们观看运行的结果可以看到,我们定义的主线程需要等待10个信号量的释放才能运行.
四 .作用
CountDownLatch能做什么呢?
首先它可以启动线程任务,但是需要足够的信号量,这也就是说,我们可以通过释放信号量来启动一个线程任务的运行.
总的来说,这个类相当简单,但是效果却很明显.
五 .实现
没什么的,AQS就是实现的方式.其中AQS中的int就表示的这个信号量的数量.