背景
需要將項目中的線程池統一管理,并且提供統一的監控。不至于等到程序崩潰的時候才發現。
思路
1、所有的線程池統一管理,寫死在代碼里,或者提供一個統一的配置文件。使用的時候,通過getbykey來獲取。
2、所有的線程池設置一個name和一個允許堆積的最大數量,一旦超過這個數量,發送報警郵件,給出哪個線程池堆積了多少。
實現
首先定義自己封裝過一次的線程池實體。
然后,我們再新建一個類LocalExecutorManager,用于將線程池進行集中化管理,并且啟動監控線程。監控間隔為60秒一次。如果需要的話,可以自己改。
然后我們再來看看監控的代碼:
最后,我們用junit來測試一下效果:
得出的結果如下:
總結
好處是我們把所有的線程池集中的管理起來,不允許在代碼中隨意新增線程池。并且提供了統一的監控,當程序出現異常時,我們能及早的發現并解決問題。
當然,單獨用一個線程來監控線程池,這個本身也是一種消耗,但是個人覺得這個消耗是值得的。
同時我們也對線程池的功能進行了閹割,但是這個想要放開應該也不難,自己去實現下其他3種線程池的監控即可。