[多线程] 多线程工具之CountDownLatch

前言

在Java中, 如何启动多个线程. 随后使某项任务分步执行.


使用Join方法


使用CountDownLatch

CountDownLatch 内核心方法:

  • await(): 等待. 当count值为0时, 才能继续执行.
  • countDown(): 和方法名一样. 具体作用时将方法名称-1.
  • getCount(): 获取当前count值.

简单都小测试

import java.util.concurrent.CountDownLatch;

public class TestJava {

    public static final CountDownLatch countDownLatch = new CountDownLatch(3);

    public static void main(String[] args) throws InterruptedException {
        Thread threadA1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("AThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
                countDownLatch.countDown();
            }
        });
        Thread threadA2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("AThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
                countDownLatch.countDown();
            }
        });
        Thread threadA3 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("AThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
                countDownLatch.countDown();
            }
        });
        threadA1.start();
        threadA2.start();
        threadA3.start();
        // 等待3个线程都执行完成
        countDownLatch.await();
        Thread threadB1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("BThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
            }
        });
        Thread threadB2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("BThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
            }
        });
        threadB1.start();
        threadB2.start();
    }


}

实现细节

CountDownLatch其实也是使用AQS对Java中锁的一种实现方式. 有空的话可以详细解读下具体实现.


Reference

上一篇:CountDownLatch用法


下一篇:CountDownlatch(等待多线程完成)