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
来简化代码,并保证线程安全性。