Java线程同步工具-CyclicBarrier

来源:互联网 发布:c语言定义二维数组 编辑:程序博客网 时间:2024/06/06 01:22

CyclicBarrier

可以近似理解为线程运行的任务总量

  • 测试代码
package com.zhiwei.thread;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CyclicBarrierTest {    public static void main(String[] args) {        // 思想:只有各个任务都完成了采取执行下一步,如果有线程提前完成则等待        ExecutorService threadPool = Executors.newCachedThreadPool();        CyclicBarrier cb = new CyclicBarrier(3); // 规定总的任务量:只有全部完成才会进行下一步处理        for (int i = 0; i < 3; i++) {            threadPool.execute(new Runnable() {                @Override                public void run() {                    try {                        Thread.sleep((long) (Math.random() * 10000));                        System.out.println(Thread.currentThread().getName() + ":完成分任务,剩余任务:" + (2 - cb.getNumberWaiting()));                        //如果前面2个线程阻塞+正在运行的线程 = 3,表明总任务完成                        if (cb.getNumberWaiting() == 2) {                            System.out.println("恭喜,总任务已完成!");                        }                        cb.await(); //分任务完成则等待,直到搜索的任务都完成,才执行await后面的代码                    } catch (Exception e) {                        e.printStackTrace();                    }                }            });        }        threadPool.shutdown();    }}
  • 效果
    这里写图片描述
原创粉丝点击