学习CyclicBarrier

public class CycleBarrierTestl {
    private static CyclicBarrier a = new CyclicBarrier(2, new Runnable() {
        @Override
        public void run() {
            System.out.println(" 任务完成阶段执行 " + Thread.currentThread());
        }
    });

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println(" main方法线程池1 " + Thread.currentThread());
                try {
                    a.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(" main方法线程池1执行完成 " + Thread.currentThread());
                System.out.println(" main方法线程池1第二阶段开始执行 " + Thread.currentThread());
                try {
                    a.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(" main方法线程池1第二阶段完成执行 " + Thread.currentThread());
            }
        });
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println(" main方法线程池2 " + Thread.currentThread());
                try {
                    a.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(" main方法线程池2执行完成 " + Thread.currentThread());
                System.out.println(" main方法线程池2第二阶段开始执行 " + Thread.currentThread());
                try {
                    a.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(" main方法线程池2第二阶段完成执行 " + Thread.currentThread());
            }
        });
        Thread.sleep(10000L);
        executorService.shutdown();
    }
}

运行结果:

 main方法线程池1 Thread[pool-1-thread-1,5,main]
        main方法线程池2 Thread[pool-1-thread-2,5,main]
        任务完成阶段执行 Thread[pool-1-thread-2,5,main]
        main方法线程池2执行完成 Thread[pool-1-thread-2,5,main]
        main方法线程池2第二阶段开始执行 Thread[pool-1-thread-2,5,main]
        main方法线程池1执行完成 Thread[pool-1-thread-1,5,main]
        main方法线程池1第二阶段开始执行 Thread[pool-1-thread-1,5,main]
        任务完成阶段执行 Thread[pool-1-thread-1,5,main]
        main方法线程池1第二阶段完成执行 Thread[pool-1-thread-1,5,main]
        main方法线程池2第二阶段完成执行 Thread[pool-1-thread-2,5,main]

CountDownLatch与CyclicBarrier比较

  1. 相同地方都能实现让一组线程全部达到一个状态后再全部同时执行,相比join更加灵活贴合实际使用。
  2. CountDownLatch只能完成一次多线程同步状态的执行,CyclicBarrier能够完成多次。
上一篇:CountDownLatch代码验证


下一篇:Java多线程(十一):线程组