版权声明:不短不长八字刚好@wzy https://blog.csdn.net/qq_38089964/article/details/82148010
栅栏和闭锁功能类似,都是控制线程是否马上继续执行下去。区别就是:闭锁是让所有线程等待一组事件发生之后才能继续执行下去,而栅栏就是等待一组线程到达之后才继续执行下去。
就拿建筑工地举例:闭锁相当于大门,所有工人等待大门打开这个事件发生之后才能继续通过;而栅栏就是相当于一个接送车,每一个工人就是一个线程,等到车上上满之后,也就是指定的人到齐之后,车才能发动。
而栅栏相对闭锁的区别还有一点就是栅栏可以循环使用:就比如接送车,送完了一组线程通过之后,继续阻拦下一组线程。
简单示例代码:这里的栅栏初始数就是和实际线程数(初始数整数倍)一样,如果栅栏指定的线程数大于实际执行线程数,那么栅栏会一直等待,也就是说,如果等待接送车的人达不够指定的人数,那么司机永远都不会开车。CyclicBarrier有一个构造函数有一个Runnable参数,这个Runnable会在栅栏结束等待的时候执行。
package cn.wzy.CyclicBarrier;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* @author wzy 不短不长八字刚好.
* @since 2018/8/19 20:52
*/
public class Main {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(9, new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("人到齐了,开始干活..");
}
});
for (int i = 0; i < 9; i++) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("waiting...");
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("一起来干活.");
}
}).start();
}
}
}