并发工具类——CyclicBarrier

主要是多个线程,执行await方法,直到等于初始化设置次数时,各个线程才能继续执行,否则就继续等待。

当调用await方法达到初始化之值的时候,还能进行统计的操作。

没有进行统计的代码

    public static CyclicBarrier barrier = new CyclicBarrier(4);

    public static class ActionThread implements Runnable{
        @Override
        public void run() {
            //获取线程ID
            long threadId = Thread.currentThread().getId();
            try {
                System.out.println("await before ===="+threadId);
                barrier.await();
                System.out.println("await after ===="+threadId);
            }catch (Exception e){
            }
        }
    }

    public static void main(String[] args) {
        int i =0;
        while (i<4){
            i++;
            new Thread(new ActionThread()).start();
        }
    }

运行结果:

await before ====11
await before ====14
await before ====12
await before ====13
await after ====13
await after ====11
await after ====14
await after ====12

 

需要统计的代码

    public static CyclicBarrier barrier = new CyclicBarrier(4,
            new CountThread());//加入的统计线程

    //保存记录的数据
    public static ArrayList list =
            new ArrayList();

    public static class CountThread implements  Runnable{
        @Override
        public void run() {
            System.out.println(Arrays.toString(list.toArray()));
        }
    }

    public static class ActionThread implements Runnable{
        @Override
        public void run() {
            //获取线程ID
            long threadId = Thread.currentThread().getId();
            try {
                list.add(threadId);
                System.out.println("await before ===="+threadId);
                barrier.await();
                System.out.println("await after ===="+threadId);
            }catch (Exception e){
            }
        }
    }

    public static void main(String[] args) {
        int i =0;
        while (i<4){
            i++;
            new Thread(new ActionThread()).start();
        }
    }

执行结果

await before ====12
await before ====14
await before ====13
await before ====11
[12, 14, 13, 11]
await after ====11
await after ====12
await after ====14
await after ====13

 

注:await方法是可以重复调用的。会重复执行调用统计的线程CountThread

 

posted @ 2019-07-13 16:45  陌然浅笑  阅读(84)  评论(0)    收藏  举报