来源:自学PHP网 时间:2020-09-27 14:14 作者:小飞侠 阅读:次
[导读] 详解Java回环屏障CyclicBarrier...
今天带来详解Java回环屏障CyclicBarrier教程详解
上一篇说的CountDownLatch是一个计数器,类似线程的join方法,但是有一个缺陷,就是当计数器的值到达0之后,再调用CountDownLatch的await和countDown方法就会立刻返回,就没有作用了,那么反正是一个计数器,为什么不能重复使用呢?于是就出现了这篇说的CyclicBarrier,它的状态可以被重用; 一.简单例子 用法其实和CountDownLatch差不多,也就是一个计数器,当计数器的值变为0之后,就会把阻塞的线程唤醒: package com.example.demo.study; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Study0216 { // 注意这里的构造器,第一个参数表示计数器初始值 // 第二个参数表示当计数器的值变为0的时候就触发的任务 static CyclicBarrier cyclicBarrier = new CyclicBarrier(2, () -> { System.out.println("cyclicBarrier task "); }); public static void main(String[] args) { // 新建两个线程的线程池 ExecutorService pool = Executors.newFixedThreadPool(2); // 线程1放入线程池中 pool.submit(() -> { try { System.out.println("Thread1----await-begin"); cyclicBarrier.await(); System.out.println("Thread1----await-end"); } catch (Exception e) { e.printStackTrace(); } }); // 线程2放到线程池中 pool.submit(() -> { try { System.out.println("Thread2----await-begin"); cyclicBarrier.await(); System.out.println("Thread2----await-end"); } catch (Exception e) { e.printStackTrace(); } }); // 关闭线程池,此时还在执行的任务会继续执行 pool.shutdown(); } } 我们再看看CyclicBarrier的复用性,这里比如有一个任务,有三部分组成,分别是A,B,C,然后创建两个线程去执行这个任务,必须要等到两个线程都执行完成A部分,然后才能开始执行B,只有两个线程都执行完成B部分,才能执行C: package com.example.demo.study; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Study0216 { // 这里的构造器,只有一个参数,表示计数器初始值 static CyclicBarrier cyclicBarrier = new CyclicBarrier(2); public static void main(String[] args) { // 新建两个线程的线程池 ExecutorService pool = Executors.newFixedThreadPool(2); // 线程1放入线程池中 pool.submit(() -> { try { System.out.println("Thread1----stepA-start"); cyclicBarrier.await(); System.out.println("Thread1----stepB-start"); cyclicBarrier.await(); System.out.println("Thread1----stepC-start"); } catch (Exception e) { e.printStackTrace(); } }); // 线程2放到线程池中 pool.submit(() -> { try { System.out.println("Thread2----stepA-start"); cyclicBarrier.await(); System.out.println("Thread2----stepB-start"); cyclicBarrier.await(); System.out.println("Thread2----stepC-start"); } catch (Exception e) { e.printStackTrace(); } }); // 关闭线程池,此时还在执行的任务会继续执行 pool.shutdown(); } }
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com