Java 主线程怎么判断多线程全部执行完了

在Java中,多线程可以同时执行多个任务,但在某些情况下,主线程需要等待所有的子线程执行完毕后再继续执行。那么,如何判断多线程是否全部执行完了呢?本文将介绍一种常用的方案来解决这个问题。

方案介绍

要判断多线程是否全部执行完了,我们可以使用Java中的CountDownLatch类。CountDownLatch是一个同步工具类,它可以让主线程等待多个子线程执行完毕后再继续执行。

CountDownLatch通过一个计数器来实现,计数器的初始值为子线程的数量。当子线程执行完毕时,计数器的值减1。当计数器的值为0时,主线程就知道所有的子线程都执行完了。

下面是一个使用CountDownLatch的示例代码:

import java.util.concurrent.CountDownLatch;

public class MainThreadDemo {
    public static void main(String[] args) {
        int threadCount = 5; // 子线程的数量

        CountDownLatch latch = new CountDownLatch(threadCount);

        // 创建并启动子线程
        for (int i = 0; i < threadCount; i++) {
            Thread thread = new Thread(new WorkerThread(latch));
            thread.start();
        }

        try {
            latch.await(); // 主线程等待子线程执行完毕
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("所有子线程执行完毕,继续执行主线程");
    }

    static class WorkerThread implements Runnable {
        private CountDownLatch latch;

        public WorkerThread(CountDownLatch latch) {
            this.latch = latch;
        }

        @Override
        public void run() {
            // 模拟子线程执行任务
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("子线程执行完毕");

            latch.countDown(); // 子线程执行完毕,计数器减1
        }
    }
}

在上面的示例代码中,我们创建了一个CountDownLatch对象,并将子线程的数量作为参数传入。然后,我们使用一个循环创建了threadCount个子线程,并分别启动它们。

在每个子线程中,我们首先模拟子线程执行任务的耗时操作(这里使用Thread.sleep方法模拟),然后输出一条消息表示子线程执行完毕,并调用countDown方法将计数器减1。

最后,主线程调用await方法等待计数器的值变为0。当所有的子线程都执行完毕后,计数器的值变为0,主线程就会继续执行。

类图

下面是本方案的类图:

classDiagram
    class MainThreadDemo {
        - CountDownLatch latch
        + void main(String[] args)
        - static class WorkerThread implements Runnable
    }

    class CountDownLatch {
        - int count
        + CountDownLatch(int count)
        + void await()
        + void countDown()
    }

结论

使用CountDownLatch类可以很方便地实现主线程等待多线程执行完毕的功能。通过将子线程的数量作为参数传入CountDownLatch构造方法,并在子线程执行完毕时调用countDown方法,主线程可以使用await方法等待计数器的值变为0,从而判断多线程是否全部执行完了。

在实际开发中,如果需要等待多个子线程执行完毕后再进行下一步操作,可以使用CountDownLatch来简化代码,并保证线程安全性。