美文网首页java线程
线程CountDownLatch使用

线程CountDownLatch使用

作者: 传说中的大哥 | 来源:发表于2018-11-19 11:55 被阅读0次

CountDownLatch:线程计数器,等待其他线程完成,再执行主线程

CountDownLatch latch = new CountDownLatch(2);//声明一个CountDownLatch,计数器为2

常用方法:

method description
await() 线程被挂起,它会等待直到count值为0才继续执行
await(long timeout, TimeUnit unit) 线程被挂起,设置超时时间,如果到了超时时间count还不为0,则将会继续向下执行,执行主线程
countDown() 讲count计数器做减1操作

应用场景

当我们要做一个2W条的查询,如果单线程运行等待的时间会非常久,这时我们可以考虑运行2个子线线程并行查询,每个子线程查询1W条数据,等子线程查询都结束后,再交由主线程进行汇总处理。

代码如下:

import java.util.concurrent.CountDownLatch;

/**
 * 线程计数器,等待其他线程完成,再执行主线程,例:并发查询
 */
public class CountDownLatchTest {
    public static void main(String[] args) throws InterruptedException {
        final int threadSize = 2;
        CountDownLatch latch = new CountDownLatch(threadSize);
        for (int i =1;i<=threadSize;i++){
            final int x =i;
            new Thread(()->{
                System.out.println("第"+x+"个线程查询,正在运行");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("第"+x+"个线程查询,运行完毕");
                latch.countDown();
            }).start();
        }
        System.out.println("等待所有查询查询完毕");
        latch.await();
        System.out.println("所有查询查询完毕");
        System.out.println("继续执行主线程汇总。。。。。。。");
    }
}

执行结果

等待所有查询查询完毕
第1个线程查询,正在运行
第2个线程查询,正在运行
第1个线程查询,运行完毕
第2个线程查询,运行完毕
所有查询查询完毕
继续执行主线程汇总。。。。。。。

相关文章

网友评论

    本文标题:线程CountDownLatch使用

    本文链接:https://www.haomeiwen.com/subject/vxmofqtx.html