来源:自学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