• CountDownLatch和cyclicBarrier 的使用


    CountDownLatch

    这个类使用起来比较简单.使用场景就是 你需要很多线程执行结束之后才执行最后的代码,那用这个就对了. 这个类底层是用aqs来实现的.

    这类主要使用的方法

    count.await();
    count.countDown();

    里面的API很少

    结束线程await()

    1.countDown

    2.被阻塞的线程interrupt()

      private static CountDownLatch count = new CountDownLatch(1);
        public static void main(String[] args) throws InterruptedException {
            Thread t =Thread.currentThread();
    
            new Thread(()->{
                try {
                    Thread.sleep(2000);
                    t.interrupt();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }).start();
    
            System.out.println("阻塞....");
            count.await();
            System.out.println("=====");
    
        }
    }
    View Code

     就是比如你有几个线程需要跑批你的任务你可以在countDown初始化的时候把线程数方进入

    每一个线程结束的时候调用coutDown -1 等所有线程都执行结束之后.可以进行汇总

    cyclicBarrier

    cyclicBarrier 和countDownLatch有点相似,不过他们是不同的.

    countDownLatch 是初始化一个线程数 做一个计数器的功能.相当于一个裁判,线程相当于一个一个选手.当所有选手都结束的时候,才会总的进行分数.或者其他的运算

    cyclicBarrier 也有自己的初始值,只不过他的模式,是让线程直接互相等待,打一个比方,比如去聚会,需要10个人才能吃饭,但是现在来了9个人,大家都在等这第10个人来了.才开始一起吃饭.

    就是有个await()方法当所有线程调用都到达这里的时候才会一起去执行下面的代码.

        public static void main(String[] args) throws InterruptedException {
            CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
    
            new Thread(()->{
    
                try {
                    TimeUnit.SECONDS.sleep(10);
                    System.out.println("t1 finied ");
                    cyclicBarrier.await();
                    System.out.println("t1 结束..await'");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
    
            }).start();
            new Thread(()->{
    
                try {
                    TimeUnit.SECONDS.sleep(5);
                    System.out.println("t2 finished ");
                    cyclicBarrier.await();
                    System.out.println("t2 结束..await'");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
    
            }).start();
    
            Thread.currentThread().join();
        }

    t2 finished
    t1 finied
    t1 结束..await'
    t2 结束..await'

    回调的方式

     public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
            CyclicBarrier cyclicBarrier = new CyclicBarrier(2,()->{
                System.out.println("所有都结束了");
            });
    
            new Thread(()->{
    
                try {
                    TimeUnit.SECONDS.sleep(10);
                    System.out.println("t1 finied ");
                    cyclicBarrier.await();
                    System.out.println("t1 结束..await'");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
    
            }).start();
            new Thread(()->{
    
                try {
                    TimeUnit.SECONDS.sleep(5);
                    System.out.println("t2 finished ");
                    cyclicBarrier.await();
                    System.out.println("t2 结束..await'");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
    
            }).start();
    
        }
    View Code
  • 相关阅读:
    es6三个点是深拷贝吗
    Apache Superset——开源的大数据探索分析、可视化报表平台
    TypeScript 类型体操指北
    【C#】Tuple(元组)
    你真的知道flex: 1;是什么意思吗?
    Unity 将是驱动 C# 增长的引擎吗 ?
    Vue中的Object.defineProperty全面理解
    桌面应用程序Exe 是带有WinForm界面的。
    微软的 Visual C++
    componentWillReceiveProps代替方案
  • 原文地址:https://www.cnblogs.com/bj-xiaodao/p/10819130.html
Copyright © 2020-2023  润新知