我在配置自定義線程池時沒有配置initialize()方法,為什么程序仍然可以正常運行?

我在配置自定義線程池時沒有配置initialize()方法,為什么程序仍然可以正常運行?

深入理解自定義線程池的 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 幫你完成了這一調用。

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享