中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java線程池使用后到底要關閉嗎

發布時間:2020-08-19 13:04:14 來源:腳本之家 閱讀:397 作者:煩囂的人 欄目:編程語言

線程池做什么

網絡請求通常有兩種形式:

第一種,請求不是很頻繁,而且每次連接后會保持相當一段時間來讀數據或者寫數據,最后斷開,如文件下載,網絡流媒體等。

另一種形式是請求頻繁,但是連接上以后讀/寫很少量的數據就斷開連接。考慮到服務的并發問題,如果每個請求來到以后服務都為它啟動一個線程,那么這對服務的資源可能會造成很大的浪費,特別是第二種情況。

因為通常情況下,創建線程是需要一定的耗時的,設這個時間為T1,而連接后讀/寫服務的時間為T2,當T1>>T2時,我們就應當考慮一種策略或者機制來控制,使得服務對于第二種請求方式也能在較低的功耗下完成。

通常,我們可以用線程池來解決這個問題,首先,在服務啟動的時候,我們可以啟動好幾個線程,并用一個容器(如線程池)來管理這些線程。

當請求到來時,可以從池中取一個線程出來,執行任務(通常是對請求的響應),當任務結束后,再將這個線程放入池中備用;

如果請求到來而池中沒有空閑的線程,該請求需要排隊等候。最后,當服務關閉時銷毀該池即可。

然而最近在開發中用到了java的線程池,然后就很疑惑這個線程池到底要不要手動關閉,感覺是要關閉的,但是沒人強調線程池用完要關閉。so今天來試驗下到底線程池用完要不要關閉。

直接上實驗代碼

public static void main(String[] args) throws Exception {
  //用于獲取到本java進程,進而獲取總線程數
 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("當前線程總數為:"+bean.getThreadCount());
   });
  }
 }
 Thread.sleep(10000);
 System.out.println("線程總數為 = " + bean.getThreadCount());
}

簡單來說就是在一個 for 循環中創建線程池,然后執行一個打印任務(不執行任務線程不會真正創建),打印出當前 java 進程的總線程數,下面是打印部分結果:

java線程池使用后到底要關閉嗎

線程

可以看到在創建到 15 萬個線程是爆內存,內存占用百分百后 java 應用崩潰。說明線程未被回收。

PS:內存占用百分百后,部分應用開始出現異常,界面花屏,閃屏,不能正常繪制gui,不知道為啥,即使后面內存占用降下來也一樣,只能重啟應用。

結論

使用完線程池一定記得回收,否則跑著跑著就內存爆炸崩潰。回收函數如下:

//執行此函數后線程池不再接收新任務,并等待所有任務執行完畢后銷毀線程。此函數不會等待銷毀完畢
executor.shutdown();
//立即結束所有線程,不管是否正在運行,返回未執行完畢的任務列表
executor.shutdownNow();

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

穆棱市| 京山县| 修水县| 新泰市| 沅陵县| 司法| 府谷县| 金川县| 揭阳市| 稻城县| 胶州市| 招远市| 天祝| 芦山县| 永兴县| 桓仁| 红桥区| 宁都县| 太湖县| 固始县| 西平县| 湖口县| 那坡县| 桦南县| 芦溪县| 沂南县| 扎赉特旗| 小金县| 咸宁市| 库尔勒市| 柳林县| 海盐县| 芷江| 贵溪市| 拜泉县| 会宁县| 宜章县| 准格尔旗| 易门县| 洪洞县| 宁远县|