Java线程--CyclicBarrier使用

原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867687.html

Java线程--CyclicBarrier使用, 代码里头有详细注释:

 

public static void main(String[] args) {
        /**
         * 可循环使用的栅栏
         * parties表示需要多少个线程同时执行, 相当于一个起跑线
         * 2代表2个线程必须在 await()方法的地方都暂停一下, 等其他人到齐了一起执行
         * 第二个参数代表新建一个线程在所有等待的线程方法之前执行
         */
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() {
            @Override
            public void run() {
                System.out.println("先执行这个方法!");
            }
        });
        ExecutorService service1 = Executors.newSingleThreadExecutor();
        service1.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    /**
                     * 设定一个起跑点 , 所有设置了await()方法的线程都必须等到这个时候开始执行
                     * 不能抢跑
                     */
                    cyclicBarrier.await();
                    System.out.println(new Date());
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程:"+Thread.currentThread().getName()+"执行");
            }
        });
        service1.shutdown();

        ExecutorService service2 = Executors.newSingleThreadExecutor();
        service2.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    /**
                     * 设定一个起跑点 , 所有设置了await()方法的线程都必须等到这个时候开始执行
                     * 不能抢跑
                     */
                    cyclicBarrier.await();
                    System.out.println(new Date());
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程:"+Thread.currentThread().getName()+"执行");
            }
        });
        service2.shutdown();
    }

打印如下;

先执行这个方法!
Fri Nov 15 16:51:14 CST 2019
Fri Nov 15 16:51:14 CST 2019
子线程:pool-1-thread-1执行
子线程:pool-2-thread-1执行

 

上一篇:CyclicBarrier源码解析


下一篇:对于System.Net.Http的学习(二)——使用 HttpClient 进行连接