并发编程的问题,关于CyclicBarrier

=

public class CyclicBarrierTest2 {
    static CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new A());


    public static void main(String[] args) {
        new Thread(()->{
            try {
                cyclicBarrier.await();
            }catch (Exception e){
                
            }
            System.out.println(1);
        }).start();
        
        try{
            cyclicBarrier.await();
        }catch (Exception e){
            
        }
        System.out.println(2);
        
    }
    
    static class A implements Runnable {
        @Override
        public void run() {
            System.out.println("3");
        }
    }
}


《java并发编程艺术》上看到的,为什么这段代码输出一定是312?
3第一个输出没问题,但1和2不是应该随机顺序吗?

于是我好奇又加了一个线程

public class CyclicBarrierTest2 {
    static CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new A());


    public static void main(String[] args) {
        new Thread(()->{
            try {
                cyclicBarrier.await();
            }catch (Exception e){
                
            }
            System.out.println(1);
        }).start();


        new Thread(()->{
            try {
                cyclicBarrier.await();
            }catch (Exception e){

            }
            System.out.println(4);
        }).start();

        try{
            cyclicBarrier.await();
        }catch (Exception e){
            
        }
        System.out.println(2);
        
    }
    
    static class A implements Runnable {
        @Override
        public void run() {
            System.out.println("3");
        }
    }
}


发现除了3是第一个输出,其他都是随机的,好奇怪= =

[https://blog.csdn.net/weixin_39933336/article/details/111819084?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.pc_relevant_paycolumn_v2&spm=1001.2101.3001.4242.1&utm_relevant_index=3](Main一定会比new Thread(一个)的执行的快)
如果main里面有多个new Thread他们之间就是随机的

public class CyclicBarrierDemo1 {

    // 第一步会执行这个静态语句
    static CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new A());

    /**
     * 输出结果:
     *   实例化
     *   Thread-0到达栅栏
     *   main到达栅栏
     *   1
     *   2
     *   3
     *   4
     *   5
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {

        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "到达栅栏");
            try {
                // 这里wait了(await() 表示自己[new Thread]已经到达栅栏),由CyclicBarrier实例化的参数parties可知,需要两个线程同时到达栅栏,所以这里卡住
                cyclicBarrier.await();

                // 最后一个到达线程[new Thread]要做的任务 - 输出线程完成最后任务 这里会执行输出1

                System.out.println(2);
            } catch (Exception e) {
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(5);
        }).start();

        // 如果这个限制放开 1-3-4-2-5
        // Thread.sleep(1000);

        try {
            // 这里会比new Thread先执行
            System.out.println(Thread.currentThread().getName() + "到达栅栏");

            // 这里wait了(await() 表示自己[Main线程]已经到达栅栏),卡住
            cyclicBarrier.await();

            System.out.println(3);
        } catch (Exception e) {

        }

        System.out.println(4);

    }

    static class A implements Runnable {
        public A() {
            System.out.println("实例化");
        }

        @Override
        public void run() {
            System.out.println("1");
        }
    }


}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632