这篇文章主要介绍了Java并发编程之常用的辅助类是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
1. countdownlatch
,收于1.2点。示例:班长锁门问题
问题描述:假如有7个同学晚上上自习,钥匙在班长手上,并且要负责锁门。班长必须要等所有人都走光了,班长才能关灯锁的门。这6个同学的顺序是无序的,不知道它们是何时离开。6个同学各上各的自习,中间没有交互。假如说6个学生是普通线程,班长是主线程,如何让主线程要等一堆线程运行完了,主线程才能运行完成呢。
public class CountDownLatchDemo { public static  void main (String [], args), {//,TODO Auto-generated method 存根 (int i=1; i<=6;我+ +){ new 线程(()→{ System.out.println (Thread.currentThread () . getname () +“\ t离开教室“); },String.valueOf(我).start (); } System.out.println (Thread.currentThread () . getname () +“\ t班长关门走人“); } }
运行结果截图
最后还有三个人被锁在教师了,这样可能会发生事故,所以肯定不行的。
我们要想实现这样的效果,就是等其它线程全部走完了,主线程才能运行。就需要借助JUC中的CountDownLatch类
1.2.CountDownLatch类简介:
1.2.1 CountDownLatch概念
<强> CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。强>
<强> CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行强>。<强>使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务强>。
CountDownLatch说明:计数计数,向下倒计算,门闩开始
1.2.3 CountDownLatch的用法
<强>某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为新CountDownLatch (n),每当一个任务线程执行完毕,就将计数器减1 countdownLatch.countDown(),当计数器的值变为0时,在CountDownLatch上等待()的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。强>
CountDownLatch底层构造函数源代码
public CountDownLatch (int 计数),{ ,if (count & lt;, 0), throw new IllegalArgumentException (“count  & lt;, 0“);=,,this.sync  new 同步(数); 以前,}>1.3。CountDownLatch案例:
public static void main (String [], args), throws InterruptedException {//6个同学正在上自习,每个人就有一个1计数器,走1个数字减1,主要线程启动,必须要等计时器从6变成0,才能开始。 CountDownLatch countDownLatch=new countDownLatch (6); (int i=1; i<=6;我+ +){ new 线程(()→{ System.out.println (Thread.currentThread () . getname () +“\ t离开教室“); countDownLatch.countDown ();//计算减少一个 },String.valueOf(我).start (); } countDownLatch.await ();//班长前面需要被阻塞 System.out.println (Thread.currentThread () . getname () +“\ t班长关门走人“); }运行结果截图
这里每个人何时走并不知道,但是可以保证每次都是班长最后一个走。
1.4。原理总结
<强> CountDownLatch主要有两个方法,当一个或多个线程调用等待方法时,这些线程会被阻塞。
强><强>其它线程调用倒计时方法将会使计数器减1(调用倒计时方法的线程不会阻塞)
强><强>当计数器的值变为0时,因等待方法阻塞的线程会被唤醒,继续执行。强>
2. cyclicbarrier
2.1。CyclicBarrier简介
循环循环,屏障屏障。
从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。
<强>它的作用就是会让所有线程都等待完成后才会继续下一步行动。
Java并发编程之常用的辅助类是什么