• 【多线程】工具类CyclicBarrier


    参考:https://blog.csdn.net/qq_38293564/java/article/details/80558157

    栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。

    CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被重置以便下次使用。

    叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier 可以被重用。

    CyclicBarrier构造方法

      CyclicBarrier(int parties):其参数表示屏障拦截的线程数量,每个线程使用await()方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。

      CyclicBarrier(int parties, Runnable barrierAction):用于线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景

    await方法:

         public int await():用来挂起当前线程,直至所有线程都到达 barrier 状态再同时执行后续任务;

      public int await(long timeout, TimeUnit unit):让这些线程等待至一定的时间,如果还有线程没有到达 barrier 状态就直接让到达 barrier 的线程执行后续任务。


    public class CyclicBarrierTest {
        // 自定义工作线程
        private static class Worker extends Thread {
            private CyclicBarrier cyclicBarrier;
            
            public Worker(CyclicBarrier cyclicBarrier) {
                this.cyclicBarrier = cyclicBarrier;
            }
            
            @Override
            public void run() {
                super.run();
                
                try {
                    System.out.println(Thread.currentThread().getName() + "开始等待其他线程");
                    cyclicBarrier.await();
                    System.out.println(Thread.currentThread().getName() + "开始执行");
                    // 工作线程开始处理,这里用Thread.sleep()来模拟业务处理
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() + "执行完毕");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
     
        public static void main(String[] args) {
            int threadCount = 3;
            CyclicBarrier cyclicBarrier = new CyclicBarrier(threadCount);
            
            for (int i = 0; i < threadCount; i++) {
                System.out.println("创建工作线程" + i);
                Worker worker = new Worker(cyclicBarrier);
                worker.start();
            }
        }
    }

    执行结果:

    创建工作线程0
    创建工作线程1
    Thread-0开始等待其他线程
    创建工作线程2
    Thread-1开始等待其他线程
    Thread-2开始等待其他线程
    Thread-2开始执行
    Thread-0开始执行
    Thread-1开始执行
    Thread-1执行完毕
    Thread-0执行完毕
    Thread-2执行完毕

    CyclicBarrier和CountDownLatch的区别
      CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重置,可以使用多次,所以CyclicBarrier能够处理更为复杂的场景;

      CyclicBarrier还提供了一些其他有用的方法,比如getNumberWaiting()方法可以获得CyclicBarrier阻塞的线程数量,isBroken()方法用来了解阻塞的线程是否被中断;

      CountDownLatch允许一个或多个线程等待一组事件的产生,而CyclicBarrier用于等待其他线程运行到栅栏位置。

  • 相关阅读:
    SERV-U处于“域正离线”怎么办?
    在wampserver3.0.6中配置虚拟主机(设置二级域名)
    解决Win7系统新建选项中无记事本问题
    解决Windows Server 2008 R2安装WAMPSERVER3.0.6问题总结
    php实现定时任务的思路
    https配置for apache
    jquery传值
    有趣的em
    自我感觉良好的配搭
    正则基础整理
  • 原文地址:https://www.cnblogs.com/clarino/p/12833759.html
Copyright © 2020-2023  润新知