多线程之栅栏CyclicBarrier

版权声明:不短不长八字刚好@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();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38089964/article/details/82148010