Java并发工具辅助类的用法

  介绍

这篇文章主要讲解了Java并发工具辅助类的用法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

Java中的并发工具类

<强>一:等待多线程完成的CountDownLatch

CountDownLatch允许一个或多个线程等待其他线程完成操作。

包com.fuzhulei;
  导入java . util . concurrent。*;
  ,# 8203;/* *
  *减法计数器,主要是倒计时(计数器1)和等待(阻塞)方法,只有当计数器减为0的时候,当前线程才可以往下继续执行。
  *主要用于允许一个或多个线程等待其他线程完成操作
  * @author Huxudong
  * @createTime 2020-04-05 00:04:36
  * */公开课CountDownDemo {
  公共静态void main (String [] args)抛出InterruptedException {/* *使用其构造函数,创建一个数值为6的计数器*/CountDownLatch CountDownLatch=new CountDownLatch (6);/* *自定义线程池使用*/ExecutorService池=new ThreadPoolExecutor (
  6//核心线程池大小
  9日,//最大线程池的大小(根据是IO密集型,还是CPU密集型来确定大小)
  3 l,//超时等待时间
  TimeUnit。秒,//时间的单位
  新LinkedBlockingQueue<比;(5),//阻塞队列是哪一种
  Executors.defaultThreadFactory()//默认线程创建工厂
  新的ThreadPoolExecutor.AbortPolicy()//四大拒绝策略,选择一种
  );
  尝试{
  for (int i=0;我& lt;6;我+ +){/* *这个线程的提交,没有返回值的任务*/pool.execute (()→{
  countDownLatch.countDown ();
  System.out.println (Thread.currentThread () . getname() +“执行一次减法“);
  });
  ,# 8203;
  }
  }捕捉(异常e) {
  e.printStackTrace ();
  最后}{/* *关闭线程池*/pool.shutdown ();
  }
  ,# 8203;
  countDownLatch.await ();
  System.out.println(“执行完成了“);
  ,# 8203;
  }
  }

正确执行结果:

癑ava并发工具辅助类的用法"

但是如果我们设置计数器的容量大于6的话(相对于我的程序而言),就会被阻塞在那里

癑ava并发工具辅助类的用法"

会发现执行完成了没有被打印出来,而且程序一直没有停止,这个时候就是因为计数器没有归0,所以当前线程被阻塞,不能向下面继续进行。

<强>二:同步屏障CyclicBarrier

CyclicBarrier的翻译大致就是可循环的屏障。它主要的作用就是让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,直到最后一份线程到达屏障时,屏障才会开的门,所有被屏障拦截的线程才会继续运行。

包com.fuzhulei;
  ,# 8203;
  进口java.util.concurrent.BrokenBarrierException;
  进口java.util.concurrent.CyclicBarrier;
  ,# 8203;/* *
  * CyclicBarrier是一个加法计数器,即同步屏障,可循环的屏障,让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,直到最后一个线程到达屏障,达到了一开始初始化的屏障的数的值,
  *屏障才可以打开的门,所有被拦截的线程才可以继续工作,主要是通过调用等待方法来实现的
  * @author Huxudong
  * @createTime 2020-04-04 22:53:50
  * */公开课CyclicBarrierDemo {
  公共静态void main (String [] args) {
  CyclicBarrier CyclicBarrier=new CyclicBarrier (3);
  新线程(()→{
  ,# 8203;
  尝试{
  cyclicBarrier.await ();
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }捕捉(BrokenBarrierException e) {
  e.printStackTrace ();
  }
  System.out.println(“线程一个已经到达屏障“);
  },“A") .start ();
  ,# 8203;
  新线程(()→{
  尝试{
  cyclicBarrier.await ();
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }捕捉(BrokenBarrierException e) {
  e.printStackTrace ();
  }
  System.out.println(“线程B已经到达屏障“);
  },“B") .start ();
  ,# 8203;
  新线程(()→{
  尝试{
  cyclicBarrier.await ();
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }捕捉(BrokenBarrierException e) {
  e.printStackTrace ();
  }
  System.out.println(“线程C已经到达屏障“);
  },“C") .start ();
  ,# 8203;
  ,# 8203;
  }
  }

执行的结果如下:

癑ava并发工具辅助类的用法"

但是如果把定义的容量大于3(相对于我的程序而言),就会发现什么都不会输出了,看截图

Java并发工具辅助类的用法