深入理解自定義線程池的 initialize() 方法
在構建自定義線程池時,你可能會注意到 initialize() 方法。 許多開發者在未顯式調用此方法時,程序也能正常運行,從而引發疑問:initialize() 方法究竟有何作用?
問題: 我在配置自定義線程池時省略了 initialize() 方法,程序依然正常運行,這是為什么?
解答: 關鍵在于 spring 框架的自動調用。
讓我們先來看一個不使用 Spring 的例子:
public class SomeTest { public static void main(String[] args) { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.submit(() -> System.out.println("!")); } }
運行這段代碼會拋出異常:“ThreadPoolTaskExecutor not initialized”。 這是因為 ThreadPoolTaskExecutor 沒有被正確初始化。
現在,讓我們使用 spring boot 來管理線程池:
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args); ThreadPoolTaskExecutor myExecutor = context.getBean("myExecutor", ThreadPoolTaskExecutor.class); myExecutor.submit(() -> System.out.println("Hello!")); } @Bean public ThreadPoolTaskExecutor myExecutor() { return new ThreadPoolTaskExecutor(); } }
這段代碼能夠正常運行。這是因為 Spring 框架自動調用了 initialize() 方法。
Spring 如何做到這一點呢? 答案在于 ExecutorConfigurationSupport 類:
@Override public void afterPropertiesSet() { initialize(); }
afterPropertiesSet() 方法是 InitializingBean 接口的一部分。 Spring Bean 的生命周期中,在 Bean 初始化完成后,Spring 會自動調用 afterPropertiesSet(),而此方法內部調用了 initialize() 方法來完成線程池的初始化工作。
因此,當你在 Spring 容器中使用線程池時,即使你沒有顯式調用 initialize(),Spring 也會自動完成初始化過程,所以程序能夠正常運行。 這并不意味著 initialize() 方法可有可無,它依然負責線程池的關鍵初始化步驟,只是 Spring 幫你完成了這一調用。