CountDownLatch简单使用

简述

CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。CountDownLatch 内部是用一个技术器实现的,计数器的初始值可以设为线程的数量,当一个线程任务结束之后,调用countDown()方法。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

简单使用场景

有时候需要多个线程同时工作但是一个线程需要等其他线程工作结束后,才能开始。举个例子,开启多个线程分块下载一个大文件,每个线程只下载固定的一截,最后由另外一个线程来拼接所有的分段,那么这时候我们可以考虑使用CountDownLatch来控制并发。

例子

class SecondThread extends Thread {
    private CountDownLatch countDownLatch;
    public SecondThread(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "start!");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            countDownLatch.countDown();
        }
        System.out.println(Thread.currentThread().getName() + "end!");
    }
}
class FristThread extends Thread {
    private CountDownLatch countDownLatch;
    private Long           time;
    public FristThread(CountDownLatch countDownLatch, Long time) {
        this.countDownLatch = countDownLatch;
        this.time = time;
    }

    @Override
    public void run() {

        System.out.println(Thread.currentThread().getName() + "start!");
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            countDownLatch.countDown();
        }
        System.out.println(Thread.currentThread().getName() + "end!");
    }
}
@Test
    public void testCountDownLatch() {
        CountDownLatch countDownLatch = new CountDownLatch(2);
        System.out.println("main start!");
        FristThread thread1 = new FristThread(countDownLatch, 10000l);
        thread1.setName("thread1");
        thread1.start();
        SecondThread thread2 = new SecondThread(countDownLatch);
        thread2.setName("thread2");
        thread2.start();
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main end!");
    }

结果

main start!
thread1start!
thread2start!
thread2end!
thread1end!
main end!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容