线程同步类:CyclicBarrier

CyclicBarrier:栅栏

构造方法:

// 一起执行的线程数
public CyclicBarrier(int parties)
// 一起执行的线程数,barrierAction优先开始执行的线程
public CyclicBarrier(int parties, Runnable barrierAction)

主要方法:
await方法:让线程进入barrier状态,当进入barrier状态的线程数到达构造CyclicBarrier的parties数量时,这些线程就会一起执行

使用场景

8个运动员准备就位,然后一起跑步
思路:设置一个等待数量为8的CyclicBarrier,然后每个线程调用await,让其进入barrier状态,当barrier状态到达8时,就会一起执行
代码:
线程类:

class JymCyclicBarrierThread implements Runnable{

    private CyclicBarrier cyclicBarrier;
    private String name;

    public JymCyclicBarrierThread(CyclicBarrier cyclicBarrier, String name) {
        this.cyclicBarrier = cyclicBarrier;
        this.name = name;
    }

    public void run() {
        System.out.println(name+"就位");
        try {
            cyclicBarrier.await();
            int time = new Random().nextInt(5);
            Thread.sleep(time*1000);
            System.out.println(name+"用时:"+time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

线程池:

class JymExecutor{
    private CyclicBarrier cyclicBarrier = new CyclicBarrier(8);

    public void start(){
        List<JymCyclicBarrierThread> jymCyclicBarrierThreadList = new ArrayList<JymCyclicBarrierThread>();
        jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"亚索"));
        jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"盖伦"));
        jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"佐伊"));
        jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"薇恩"));
        jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"奎因"));
        jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"赵信"));
        jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"皇子"));
        jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"剑圣"));
        ExecutorService executor = Executors.newFixedThreadPool(8);
        for (JymCyclicBarrierThread jymCyclicBarrierThread : jymCyclicBarrierThreadList) {
            executor.submit(jymCyclicBarrierThread);
        }
        executor.shutdown();
    }
}

测试代码:

    public static void main(String[] args) {
        JymExecutor jymExecutor = new JymExecutor();
        jymExecutor.start();

    }

结果:
在这里插入图片描述

学习年限不足,知识过浅,说的不对请见谅。

世界上有10种人,一种是懂二进制的,一种是不懂二进制的。

发布了71 篇原创文章 · 获赞 54 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/weixin_43326401/article/details/104121592