awaitTermination 怎么使用
awaittermination</p> <p><img src="https://img.php.cn/upload/article/001/242/473/179428758145199.png" alt="Java 线程池中 awaitTermination 怎么使用"></p> <h2>如何正确实现带超时的优雅关闭</h2> <p>在调用 <code>shutdown()后,必须配合
awaitTermination 和超时参数来等待任务完成。如果线程池在指定时间内未能完成任务,需要进一步处理(如强制终止)。通过循环检查或设置合理的超时时间,可以避免无限期阻塞。

import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(3);
// 提交任务
for (int i = 0; i < 5; i++) {
final int taskId = i;
executor.submit(() -> {
System.out.println("Task " + taskId + " running");
try { Thread.sleep(1000); } catch (InterruptedException e) {}
});
}
// 启动关闭流程
executor.shutdown();
boolean terminated = false;
while (!terminated) {
terminated = executor.awaitTermination(1, TimeUnit.SECONDS);
}
System.out.println("All tasks completed.");
}
}
未设置超时时间的后果是什么
如果在调用 awaitTermination 时不设置超时时间(即传入负数或零),线程将永久阻塞,直到所有任务完成。这可能导致应用程序挂起,特别是在任务执行时间不确定或存在死锁的情况下。因此,始终建议设置一个合理的超时值,并在超时后采取适当的措施(如强制终止)。
立即学习“Java免费学习笔记(深入)”;

import java.util.concurrent.*;
public class NoTimeoutExample {
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(3);
// 提交任务
for (int i = 0; i < 5; i++) {
final int taskId = i;
executor.submit(() -> {
System.out.println("Task " + taskId + " running");
try { Thread.sleep(2000); } catch (InterruptedException e) {}
});
}
// 无超时等待
executor.shutdown();
executor.awaitTermination(-1, TimeUnit.MILLISECONDS); // 永久阻塞
System.out.println("This line will never be reached if tasks take too long.");
}
}


















