CountDownLatch 和 CyclicBarrier 是并发编程中常用的辅助类,两者使用上有点类似,但又有不同。

一、CountDownLatch

  CountDownLatch 可是实现类似计数器的功能,比如一个线程 A 需要等待其余多个任务执行完毕后才能执行,此时可以使用这个工具类。 

  构造器:

public CountDownLatch(int count) { }

  主要方法:

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

  示例方法:

public static void main(String[] args) {

    final CountDownLatch latch = new CountDownLatch(2);

    new Thread() {
        @Override
        public void run() {
            try {
                System.out.println("子线程" + Thread.currentThread().getName() + "正在执行");
                Thread.sleep(3000);
                System.out.println("子线程" + Thread.currentThread().getName() + "执行完毕");
                latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }.start();

    new Thread() {
        @Override
        public void run() {
            try {
                System.out.println("子线程" + Thread.currentThread().getName() + "正在执行");
                Thread.sleep(3000);
                System.out.println("子线程" + Thread.currentThread().getName() + "执行完毕");
                latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }.start();

    try {
        System.out.println("等待2个子线程执行完毕...");
        latch.await();
        System.out.println("2个子线程已经执行完毕");
        System.out.println("继续执行主线程");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
View Code

相关文章:

  • 2021-06-20
  • 2021-10-10
  • 2021-11-10
  • 2021-11-27
  • 2021-05-31
猜你喜欢
  • 2021-07-10
  • 2021-11-06
  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2022-01-10
  • 2021-07-02
相关资源
相似解决方案