java線程池使用后到底要關閉嗎
線程池做什么
網(wǎng)絡請求通常有兩種形式:
第一種,請求不是很頻繁,而且每次連接后會保持相當一段時間來讀數(shù)據(jù)或者寫數(shù)據(jù),最后斷開,如文件下載,網(wǎng)絡流媒體等。
另一種形式是請求頻繁,但是連接上以后讀/寫很少量的數(shù)據(jù)就斷開連接??紤]到服務的并發(fā)問題,如果每個請求來到以后服務都為它啟動一個線程,那么這對服務的資源可能會造成很大的浪費,特別是第二種情況。
因為通常情況下,創(chuàng)建線程是需要一定的耗時的,設這個時間為T1,而連接后讀/寫服務的時間為T2,當T1>>T2時,我們就應當考慮一種策略或者機制來控制,使得服務對于第二種請求方式也能在較低的功耗下完成。
通常,我們可以用線程池來解決這個問題,首先,在服務啟動的時候,我們可以啟動好幾個線程,并用一個容器(如線程池)來管理這些線程。
當請求到來時,可以從池中取一個線程出來,執(zhí)行任務(通常是對請求的響應),當任務結束后,再將這個線程放入池中備用;
如果請求到來而池中沒有空閑的線程,該請求需要排隊等候。最后,當服務關閉時銷毀該池即可。
然而最近在開發(fā)中用到了java的線程池,然后就很疑惑這個線程池到底要不要手動關閉,感覺是要關閉的,但是沒人強調線程池用完要關閉。so今天來試驗下到底線程池用完要不要關閉。
直接上實驗代碼
public static void main(String[] args) throws Exception { //用于獲取到本java進程,進而獲取總線程數(shù) RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean(); String jvmName = runtimeBean.getName(); System.out.println("JVM Name = " + jvmName); long pid = Long.valueOf(jvmName.split("@")[0]); System.out.println("JVM PID = " + pid); ThreadMXBean bean = ManagementFactory.getThreadMXBean(); int n = 30000; for (int i = 0; i < n; i++) { ThreadPoolExecutor executor = new ThreadPoolExecutor(10,20,1000,TimeUnit.SECONDS,new LinkedBlockingDeque<>()); for(int j=0;j<10;j++){ executor.execute(()->{ System.out.println("當前線程總數(shù)為:"+bean.getThreadCount()); }); } } Thread.sleep(10000); System.out.println("線程總數(shù)為 = " + bean.getThreadCount()); }
簡單來說就是在一個 for 循環(huán)中創(chuàng)建線程池,然后執(zhí)行一個打印任務(不執(zhí)行任務線程不會真正創(chuàng)建),打印出當前 java 進程的總線程數(shù),下面是打印部分結果:
線程
可以看到在創(chuàng)建到 15 萬個線程是爆內存,內存占用百分百后 java 應用崩潰。說明線程未被回收。
PS:內存占用百分百后,部分應用開始出現(xiàn)異常,界面花屏,閃屏,不能正常繪制gui,不知道為啥,即使后面內存占用降下來也一樣,只能重啟應用。
結論
使用完線程池一定記得回收,否則跑著跑著就內存爆炸崩潰?;厥蘸瘮?shù)如下:
//執(zhí)行此函數(shù)后線程池不再接收新任務,并等待所有任務執(zhí)行完畢后銷毀線程。此函數(shù)不會等待銷毀完畢 executor.shutdown(); //立即結束所有線程,不管是否正在運行,返回未執(zhí)行完畢的任務列表 executor.shutdownNow();
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
詳解如何在SpringBoot中優(yōu)雅地重試調用第三方API
作為后端程序員,我們的日常工作就是調用一些第三方服務,將數(shù)據(jù)存入數(shù)據(jù)庫,返回信息給前端。本文為大家介紹了如何在SpringBoot中優(yōu)雅地重試調用第三方API,需要的可以參考一下2022-12-12SpringBoot中自定義首頁(默認頁)及favicon的方法
這篇文章主要介紹了SpringBoot中如何自定義首頁(默認頁)及favicon,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08