2022更文挑战26-java并发关键字:cyclicBarrier

124 阅读2分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。

java并发关键字:cyclicBarrier

前文

本文内容为个人对于java并发关键词cyclicBarrier相关知识的一些总结及整理,如果存在不准确之处还请见谅。

cyclicBarrier关键字

该关键字根据字面英文意思来说,可以简单的理解为循环屏障。实际上,这是一个并发处理的关键字。当同时有多个线程在执行时,我们很难控制线程之间的执行顺序。而这个关键字便应运而生,它主要是保证线程多个线程能够同时开启。假设有3个线程需要同时执行,此时便可利用该关键字。通过关键字的控制,能够保证三个线程都会等待彼此准备好后同时开启。

看一下该关键字的用法。初始化阶段需要指定逻辑中控制的线程数目,同时可选性的可以指定一个回调函数,该回调函数会在所有线程同时开启执行后执行。而在需要控制执行顺序的线程方法中,需要调用await方法。该方法表示该线程已经准备好,等待其他线程开启后同时执行后续逻辑。当所有线程都执行await方法后,所有线程会同时开启后面的逻辑,也就保证了线程能够按照我们需要的顺序执行。

下面来简单看一下代码:

public static void main(String[] args) {
    CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() {
        @Override
        public void run() {
            System.out.println("所有线程均启动执行");
        }
    });
    Thread thread1 = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                cyclicBarrier.await();
                System.out.println("线程1开始执行-----");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    });

    Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
            Thread.sleep(5000);
                cyclicBarrier.await();
                System.out.println("线程2开始执行-----");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    });

    thread1.start();
    thread2.start();

}

根据上述代码的执行结果可以看到,一直到5秒后所有线程都准备好才打印“所有线程均启动执行”。此后两个线程的逻辑内部的打印才同时出现,也就是线程1在准备好后等待了5秒,等待线程2准备部分执行完毕。因此,也就达到了控制线程顺序的目的。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。