有图有真相的QQ资源、网赚教程分享,高质量的网络教程和软件下载
保存到桌面加入收藏设为首页
冷牛教程网
当前位置:首页 > 技术文章 > JAVA

CountDownLatch实现多线程同步用法

2021-08-07 00:05:33   admin      867  

  CountDownLatch存在于java.util.concurrent包下,在java1.5版本时与CyclicBarrier、Semaphore、concurrentHashMap、BlockingQueue一起发布。

  CountDownLatch可以使各线程同步进行,使执行线程等待其他线程各自执行完毕后再继续执行。


  初始化

final CountDownLatch count=new CountDownLatch(2);

  构造方法内的参数为线程个数,上述线程个数为2,代表等待两个线程执行完毕。

  要使其发生作用,必须要await方法和countDown方法。

  一、count.await方法使当前线程开启阻塞状态,等待执行countDown方法的数量为2的时候结束阻塞。

  二、countDown方法每执行一次,原先定义的count值就会-1,等减到0的时候,所有await方法结束阻塞。

使用场景:在执行多线程测试高并发时,可能受线程创建时间的影响,所有线程未必在同一时刻执行,这就违背了做多线程高并发测试的目的。必须我们要测试数据库在500个并发时的响应速度,使用循环语句创建500个线程并执行,而实际在同一时刻执行的线程数量并没有500个。


下面是由CountDownLatch实现的,所有线程同步进行代码。

    public static void main(String[] args) {
        final CountDownLatch count=new CountDownLatch(2);
        new Thread(()->{
            count.countDown();
            try {
                count.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("一号线程准备就绪");
            // 执行数据库查询逻辑
        }).start();
        new Thread(()->{
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            count.countDown();
            try {
                count.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("一号线程准备就绪");
            // 执行数据库查询逻辑
        }).start();
    }

  本次测试仅用了两个线程,并且第二个线程在开启前延迟了3秒,最终结果是两个线程能够在同一时刻响应。

 输出结果:

 延迟3秒后输出:


一号线程准备就绪
一号线程准备就绪


第二个线程进行延时,模拟了线程的创建时间,而最终结果两个线程虽执行时间不同,但是能够在同一时刻执行相同的业务逻辑,实现了多线程同时响应的目的。


相关评论
冷牛网络 2015-2021 版权所有  豫ICP备2021000561号-1