MST

星途 面试题库

面试题:Java中如何用CountDownLatch实现线程按顺序执行

假设有三个线程A、B、C,要求线程B在线程A执行完毕后开始执行,线程C在线程B执行完毕后开始执行。请使用Java的CountDownLatch实现该功能,并说明实现思路。
14.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 创建两个 CountDownLatch 对象,分别用于控制线程 B 等待线程 A 执行完毕,以及线程 C 等待线程 B 执行完毕。
  2. 在线程 A 执行完毕后,调用 CountDownLatchcountDown() 方法,将计数减一。
  3. 在线程 B 的开始部分调用 CountDownLatchawait() 方法,等待计数变为 0,即线程 A 执行完毕。
  4. 在线程 B 执行完毕后,再次调用 CountDownLatchcountDown() 方法,将计数减一。
  5. 在线程 C 的开始部分调用 CountDownLatchawait() 方法,等待计数变为 0,即线程 B 执行完毕。

代码实现

import java.util.concurrent.CountDownLatch;

public class ThreadSequenceWithCountDownLatch {
    public static void main(String[] args) {
        // 创建两个CountDownLatch对象,初始计数都为1
        CountDownLatch latchAB = new CountDownLatch(1);
        CountDownLatch latchBC = new CountDownLatch(1);

        Thread threadA = new Thread(() -> {
            System.out.println("线程A开始执行");
            // 模拟线程A执行任务
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程A执行完毕");
            latchAB.countDown();
        });

        Thread threadB = new Thread(() -> {
            try {
                System.out.println("线程B等待线程A执行完毕");
                latchAB.await();
                System.out.println("线程B开始执行");
                // 模拟线程B执行任务
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程B执行完毕");
                latchBC.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread threadC = new Thread(() -> {
            try {
                System.out.println("线程C等待线程B执行完毕");
                latchBC.await();
                System.out.println("线程C开始执行");
                // 模拟线程C执行任务
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程C执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        threadA.start();
        threadB.start();
        threadC.start();
    }
}