• 递减计数门闩CountDownLatch


    CountDownLatch允许一个或多个线程等待其他线程完成操作。

    相当于是一个门栓,一开始是关闭的,所有希望通过该门的线程都需要等待,等待计数器变为0后,门栓打开,等待的所有线程都可以通过,它是一次性的,打开后就不能再关上了。

    CountDownLatch里有一个计数,这个计数通过构造方法进行传递:

    public CountDownLatch(int count)
    

    多个线程可以基于这个计数进行协作,它的主要方法有:

    public void await() throws InterruptedException
    public boolean await(long timeout, TimeUnit unit) throws InterruptedException
    public void countDown()
    

    await检查计数是否为0,如果大于0,就等待,await可以被中断,也可以设置最长等待时间。countDown检查计数,如果已经为0,直接返回,否则减少计数,如果新的计数变为0,则唤醒所有等待的线程。

    要实现主线程等待所有线程完成操作,最简单的做法是使用join()方法

    public class JoinCountDownLatchTest {
        public static void main(String[] args) throws InterruptedException {
            Thread parser1 = new Thread(new Runnable() {
                @Override
                public void run() {
                }
            });
            Thread parser2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("parser2 finish");
                }
            });
            parser1.start();
            parser2.start();
            parser1.join();
            parser2.join();
            System.out.println("all parser finish");
        }
    }
    

    join用于让当前执行线程等待join线程执行结束。其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远等待。

    在JDK 1.5之后的并发包中提供的CountDownLatch也可以实现join的功能,并且比join的功能更多

    public class CountDownLatchTest {
        static CountDownLatch c = new CountDownLatch(2);
        public static void main(String[] args) throws InterruptedException {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(1);
                    c.countDown();
                    System.out.println(2);
                    c.countDown();
                }
            }).start();
            c.await();
            System.out.println("3");
        }
    }
    

    CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。

    当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,只需要把这个CountDownLatch的引用传递到线程里即可。

    参考: Java编程的逻辑 19.3 倒计时门栓CountDownLatch

      Java并发编程的艺术 8.1 等待多线程完成的CountDownLatch

  • 相关阅读:
    android 3G移植【转】
    【转】小白级的CocoaPods安装和使用教程
    【转】Core Bluetooth框架之二:后台处理
    【转】Core Bluetooth框架之一:Central与Peripheral
    ios ble 参考
    拼音处理
    通过触发器实现数据库的即时同步
    数据库中存取文件
    交叉报表处理实例
    SQL Server 2005 中实现通用的异步触发器架构
  • 原文地址:https://www.cnblogs.com/ooo0/p/15846011.html
Copyright © 2020-2023  润新知