在 Web 應用中,常需在 Tomcat 啟動時啟動長期執行的背景任務(如定時排程、資料預載、連線池預熱)。標準做法是實作 ServletContextListener 介面,於 contextInitialized 方法中啟動執行緒,於 contextDestroyed 中優雅關閉。
package test;
import javax.servlet.*;
public class MyCode implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// Tomcat 啟動時自動執行
new MyThread().start();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 應用關閉時執行清理邏輯
}
private static class MyThread extends Thread {
@Override
public void run() {
System.out.println("背景執行緒已啟動:測試開始");
// 此處放入長期運行的業務邏輯
}
}
}
<listener> <listener-class>test.MyCode</listener-class> </listener>
contextDestroyed 中設定中斷旗標或呼叫 interrupt(),避免資源洩漏。Thread.setDefaultUncaughtExceptionHandler 統一處理。@PostConstruct + @PreDestroy 或 CommandLineRunner / ApplicationRunner;或引入 Quartz、Spring Task 等排程框架。