介绍
这篇文章主要讲解了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; } }
正确执行结果:
但是如果我们设置计数器的容量大于6的话(相对于我的程序而言),就会被阻塞在那里
会发现执行完成了没有被打印出来,而且程序一直没有停止,这个时候就是因为计数器没有归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; } }
执行的结果如下:
但是如果把定义的容量大于3(相对于我的程序而言),就会发现什么都不会输出了,看截图