相關API:
Runtime.addShutdownHook解釋
如果妳想在jvm關閉的時候進行內存清理、對象銷毀等操作,或者僅僅想起個線程然後這個線程不會退出,妳可以使用Runtime.addShutdownHook。
這個方法的作用就是在JVM中增加壹個關閉的鉤子。當程序正常退出、系統調用 System.exit方法或者虛擬機被關閉時才會執行系統中已經設置的所有鉤子,當系統執行完這些鉤子後,JVM才會關閉。所謂鉤子,就是壹個已初始化但並不啟動的線程。JVM退出通常通過兩種事件。
程序正常退出,例如最後壹個非守護進程退出、使用System.exit()退出等
程序異常退出,例如使用Ctrl+C觸發的中斷、用戶退出或系統關閉等系統事件等 , 詳情見官方文檔:/javase/8/docs/api/index.html
Guava解釋
google退出的open sdk,提供多類並發api。
上兩篇文章講了@Configuration @Bean @Import註入線程池Bean,還有ApplicationRunner 和 CommandLineRunner接口去實現容器啟動完成事件驅動,所以結合起來舉個例子,在項目中如何註入、優雅關閉線程池。
如上圖。
1.通過@Configuration?@Bean註解去註入壹個線程池<componentThreadPool>。
2.將線程池註冊到註冊中心<ThreadPoolRegistrationCenter>
3.在Spring容器啟動完成觀察者模式中,利用ApplicationRunner接口提供的run方法,添加jvm hook鉤子,以做到jvm退出時能夠優雅關閉線程池。
其中用到了guava的<MoreExecutors.shutdownAndAwaitTermination>,jdk<Runtime.getRuntime().addShutdownHook>等API