先执行子线程,再执行主线程
时间: 2024-10-23 10:10:09 浏览: 18
C#子线程执行完后通知主线程的方法
在Java中,通常主线程和其他线程(如子线程)的执行顺序是由操作系统决定的,并非强制性的。然而,有一种情况可以尝试接近这种顺序,即主线程执行完所有任务后再启动子线程。这通常发生在主线程完成初始化、设置环境等操作之后,然后启动子线程去执行特定任务:
1. 主线程中创建并启动子线程:
```java
// 确保主线程执行完某些操作后
new Thread(() -> {
// 执行一些初始化或配置工作...
}).start();
// 等待主线程完成其工作
synchronized (this) {
while (!isInitializationDone()) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 当主线程完成初始化后,启动子线程
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
executor.submit(new Task());
}
executor.shutdown();
```
在这个例子中,通过同步块和`wait()`/`notify()`机制,主线程会在初始化完成后唤醒正在等待的子线程。
2. 使用CountDownLatch:
```java
CountDownLatch latch = new CountDownLatch(1); // 设置一个计数器
latch.countDown(); // 主线程完成后减一
// 子线程任务
new Thread(() -> {
try {
latch.await(); // 子线程等待主线程完成
} catch (InterruptedException e) {
e.printStackTrace();
}
// 这里开始执行子线程的任务
}).start();
// 等待主线程完成并调用countDown()
doSomethingThatTakesTimeThen(latch::countDown);
// 或者更简洁的方式:
latch.countDownWhen(doSomethingThatTakesTime());
```
这种方法利用了`CountDownLatch`同步线程,确保主线程结束后才执行子线程。
需要注意的是,以上方法并不能完全保证子线程总是先执行,因为线程调度仍受操作系统影响。实际应用中,除非有特殊需求,否则通常不会刻意追求严格的执行顺序。
阅读全文