cyclicbarrier是多线程并发控制实用工具
cyclicbarrier初始化时规定一个数目,然后调用await()方法进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续执行。
await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 cyclicbarrier 上面阻塞的线程开始运行。
cyclicbarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
cyclicbarrier可以接收一个参数作为barrieraction,就是当计数器一次计算完成后,程序会执行的动作。如果你想学习java可以来这个群,首先是五三二,中间是二五九,最后是九五二,里面有大量的学习资料可以下载。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIXY0N3Xu92Yp9CXzV2Zh1WavwVbvNmLllXZ0lmL3d3dvw1LcpDc0RHaiojIsJye.png)
import java.util.concurrent.brokenbarrierexception;
import java.util.concurrent.cyclicbarrier;
import java.util.concurrent.executorservice;
import java.util.concurrent.executors;
/**
*
* @author injavawetrust
*
*/
public class orange {
public static class pickorange implements runnable {
private int i;
private cyclicbarrier cb;
public pickorange(int i, cyclicbarrier cb) {
this.i = i;
this.cb = cb;
}
public void run() {
try {
pick();
cb.await(); // 等待所有橘子采摘完毕
box();
cb.await(); // 等待所有橘子装箱完毕
} catch (interruptedexception e) {
e.printstacktrace();
} catch (brokenbarrierexception e) {
}
public void pick() {
system.out.println("采摘第" + i +"个橘子完成!");
public void box() {
system.out.println("第" + i + "个橘子装箱完成!");
}
public static void main(string[] args) {
cyclicbarrier cb = new cyclicbarrier(5);
executorservice exec = executors.newfixedthreadpool(5);
for (int i = 1; i <= 5; i++) {
exec.submit(new thread(new pickorange(i, cb)));
exec.shutdown();
}
结果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIXY0N3Xu92Yp9CXzV2Zh1WavwVbvNmLllXZ0lmL3d3dvw1LcpDc0RHaiojIsJye.png)
采摘第2个橘子完成!
采摘第1个橘子完成!
采摘第5个橘子完成!
采摘第4个橘子完成!
采摘第3个橘子完成!
第3个橘子装箱完成!
第2个橘子装箱完成!
第1个橘子装箱完成!
第5个橘子装箱完成!
第4个橘子装箱完成!