zoukankan      html  css  js  c++  java
  • Java高并发程序设计(四)--CountDownLatch和CyclicBarrier

    CountDownLatch和CyclicBarrier都是用来线程协作的。

    先看CountDownLatch,它的常用方法有countDown()和await()。

    当CountDownLatch初始化时,获取一个int参数,每次调用countDown()时,初始的int减1。await()后面的代码只有当int=0时才会执行。

    下面是一个小例子:

    public class threadDemo implements Runnable{
        static final CountDownLatch cdl=new CountDownLatch(10);
        public static int i=0;
        public static void main(String[] args) throws InterruptedException
        {
            threadDemo t=new threadDemo();
            for(int i=0;i<10;i++)
            {
                new Thread(t).start();
            }
            cdl.await();
            System.out.println(System.currentTimeMillis());
            System.out.println("over!!!");
        }
    
        public void run() {
            i++;
            try {
                Thread.sleep(i*1000);
                System.out.println(System.currentTimeMillis());
                cdl.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            }
    }

    我们能看到结果,await之后的内容是到十次countdown之后才被执行。

    CyclicBarrier和CountDownLatch有些类似,不过更加强大复杂。

    CountDownLatch用await()将程序分成了两段,而CyclicBarrier可以用await()将程序分成任意多段,同样CyclicBarrier也有一个初始的int,每个线程的程序段执行之后减一,归零时循环,说起来可能有些不懂,看代码就行了,示例如下:

    public class threadDemo implements Runnable{
        static final CyclicBarrier cb=new CyclicBarrier(10);
        public static void main(String[] args) throws InterruptedException
        {
            threadDemo t=new threadDemo();
            for(int i=0;i<10;i++)
            {
                new Thread(t).start();
            }
        }
    
        public void run() {
            System.out.println("11111111");
            try {
                cb.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println("22222222");
            try {
                cb.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println("33333333");
            }
    }

     先把await注释掉,结果如下:

    去掉注释,结果如下:

    程序会将划分的程序段全部执行之后再进入下一段程序。

     上面的内容只是大概。要了解更为详细的内容可以自己看相关API。

  • 相关阅读:
    python3 driver chrome This version of ChromeDriver only supports Chrome version 89
    centos7 conda 安装 tensorflow
    python3 selenium Google浏览器 自动登录
    Fiddler Script
    深夜看了张一鸣的微博,让我越想越后怕(转载)
    OpenCV相关库
    .NET 面试题汇总(带答案)
    Java面试题
    定制化知识图谱 项目介绍
    关于《社会主义经济理论》若干问题的思考《九》
  • 原文地址:https://www.cnblogs.com/blogofjzq/p/9395991.html
Copyright © 2011-2022 走看看