• Java 多线程同步妙招 -- CountDownLatch计数器


    CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他n个批量任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

    比如我们要监控所有上游系统的状态,于是可以用一个线程池去跑每个上游系统的健康状态,等他们全部跑完我们才能返回所有系统的检测结果,这是后就可以在初始化线程池的时候也初始化一个CountDownLatch,CountDownLatch的初始化数值就是所有上游系统的数量,然后在每一个线程的run方法里面加一个 countDownLatch.countDown(); 意思是计数器减一个。然后在汇总的地方加一个 countDownLatch.await(); 意思是等待计数器减至0 (即所有线程跑完),然后进行汇总。

    综上,CountDownLatch的一般使用方式就三步:初始化计数器(count = n),计数器-1 (n - 1),等待计数器到0 (n = 0)

    CountDownLatch的重要方法:

    public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行

    public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行

    public void countDown() { };  //将count值减1

    代码示例:

    List<SupportedVehicle> vehicles = getVehicles();
    CountDownLatch countDownLatch = new CountDownLatch(vehicles.size());
    for (SupportedVehicle vehicle : vehicles) {
        pool.execute(new Runnable() {
            @Override
            public void run() {
                handleVehicle(vehicle);
                countDownLatch.countDown();
            }
        });
    }
    countDownLatch.await();
    System.out.println(vehicles);
  • 相关阅读:
    hdu 1042 N!
    hdu 1002 A + B Problem II
    c++大数模板
    hdu 1004 Let the Balloon Rise
    hdu 4027 Can you answer these queries?
    poj 2823 Sliding Window
    hdu 3074 Multiply game
    hdu 1394 Minimum Inversion Number
    hdu 5199 Gunner
    九度oj 1521 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407171.html
Copyright © 2020-2023  润新知