ExecutorService 繼承 Executor,新增生命周期控制方法,掌握其語義對生產環境優雅停機至關重要。
public interface ExecutorService extends Executor {
void shutdown();
List shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
}
// 短任務:生成10位隨機字符串 public class Task1 implements Callable{ ... } // 長任務:睡眠10秒 public class LongTask implements Callable { public String call() { TimeUnit.SECONDS.sleep(10); return "success"; } }
TERMINATED 狀態ExecutorService service = Executors.newFixedThreadPool(4);
service.submit(new Task1());
service.submit(new LongTask()); // 第3個任務耗時10秒
service.shutdown();
while (!service.awaitTermination(1, TimeUnit.SECONDS)) {
System.out.println("線程池未關閉");
}
System.out.println("線程池已關閉");
實測輸出:前 9 秒每秒打印「未關閉」,第 10 秒打印「已關閉」。
結論:shutdown() 不會中斷執行中任務,awaitTermination 僅作輪詢檢查。
ExecutorService service = Executors.newFixedThreadPool(3); for (int i=0; i<5; i++) service.submit(new LongTask()); Listleftovers = service.shutdownNow(); // 立即關閉 System.out.println(leftovers.size()); // 輸出 2(隊列中等待的任務)
行為:
Thread.interrupt())service.shutdown();
while (!service.isTerminated()) { /* 忙等待 */ }
// 退出循環時池確已 TERMINATED
配合長任務驗證:約 10 秒後返回 true。
調用 shutdown() 或 shutdownNow() 後立即返回 true,不代表任務已結束。
RUNNING → shutdown() → SHUTDOWN → (任務完成) → TERMINATED
→ shutdownNow() → STOP → (中斷處理) → TERMINATED
// 標準優雅停機模板
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow(); // 強制補刀
if (!executor.awaitTermination(60, TimeUnit.SECONDS))
log.error("Pool did not terminate");
}
} catch (InterruptedException ex) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}