摘要:但在實際開發(fā)過程中,在線程池使用過程中可能會遇到各方面的故障,如線程池阻塞,無法提交新任務(wù)等。如果你想監(jiān)控某一個線程池的執(zhí)行狀態(tài),線程池執(zhí)行類也給出了相關(guān)的能實時獲取線程池的當(dāng)前活動線程數(shù)正在排隊中的線程數(shù)已經(jīng)執(zhí)行完成的線程數(shù)總線程數(shù)等。
之前寫過一篇 Java 線程池的使用介紹文章《線程池全面解析》,全面介紹了什么是線程池、線程池核心類、線程池工作流程、線程池分類、拒絕策略、及如何提交與關(guān)閉線程池等。
但在實際開發(fā)過程中,在線程池使用過程中可能會遇到各方面的故障,如線程池阻塞,無法提交新任務(wù)等。
如果你想監(jiān)控某一個線程池的執(zhí)行狀態(tài),線程池執(zhí)行類 ThreadPoolExecutor 也給出了相關(guān)的 API, 能實時獲取線程池的當(dāng)前活動線程數(shù)、正在排隊中的線程數(shù)、已經(jīng)執(zhí)行完成的線程數(shù)、總線程數(shù)等。
總線程數(shù) = 排隊線程數(shù) + 活動線程數(shù) + 執(zhí)行完成的線程數(shù)。
下面給出一個線程池使用示例,及教你獲取線程池狀態(tài)。
private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(100000)); public static void main(String[] args) throws Exception { for (int i = 0; i < 100000; i++) { es.execute(() -> { System.out.print(1); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); } ThreadPoolExecutor tpe = ((ThreadPoolExecutor) es); while (true) { System.out.println(); int queueSize = tpe.getQueue().size(); System.out.println("當(dāng)前排隊線程數(shù):" + queueSize); int activeCount = tpe.getActiveCount(); System.out.println("當(dāng)前活動線程數(shù):" + activeCount); long completedTaskCount = tpe.getCompletedTaskCount(); System.out.println("執(zhí)行完成線程數(shù):" + completedTaskCount); long taskCount = tpe.getTaskCount(); System.out.println("總線程數(shù):" + taskCount); Thread.sleep(3000); } }
線程池提交了 100000 個任務(wù),但同時只有 50 個線程在執(zhí)行工作,我們每陋 3 秒來獲取當(dāng)前線程池的運(yùn)行狀態(tài)。
第一次程序輸出:
當(dāng)前排隊線程數(shù):99950 當(dāng)前活動線程數(shù):50 執(zhí)行完成線程數(shù):0 總線程數(shù)(排隊線程數(shù) + 活動線程數(shù) + 執(zhí)行完成線程數(shù)):100000
第二次程序輸出:
當(dāng)前排隊線程數(shù):99800 當(dāng)前活動線程數(shù):50 執(zhí)行完成線程數(shù):150 總線程數(shù)(排隊線程數(shù) + 活動線程數(shù) + 執(zhí)行完成線程數(shù)):100000
活動線程數(shù)和總線程數(shù)是不變的,排隊中的線程數(shù)和執(zhí)行完成的線程數(shù)不斷在變化,直到所有任務(wù)執(zhí)行完畢,最后輸出:
當(dāng)前排隊線程數(shù):0 當(dāng)前活動線程數(shù):0 執(zhí)行完成線程數(shù):100000 總線程數(shù)(排隊線程數(shù) + 活動線程數(shù) + 執(zhí)行完成線程數(shù)):100000
這樣,你了解了這些 API 的使用方法,你想監(jiān)控線程池的狀態(tài)就非常方便了。
推薦:Spring Boot & Cloud 最強(qiáng)技術(shù)教程
掃描關(guān)注我們的微信公眾號,干貨每天更新。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71278.html
摘要:結(jié)構(gòu)型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態(tài)模式策略模式職責(zé)鏈模式責(zé)任鏈模式訪問者模式。 主要版本 更新時間 備注 v1.0 2015-08-01 首次發(fā)布 v1.1 2018-03-12 增加新技術(shù)知識、完善知識體系 v2.0 2019-02-19 結(jié)構(gòu)...
摘要:一個是線程退出條件,一個是異常處理情況。很方便,每個線程一份數(shù)據(jù),也很安全,但要注意內(nèi)存泄露。線程池參數(shù)包最常用的就是線程池,平常工作建議直接使用線程池,類就可以降低優(yōu)先級了。在線程池的構(gòu)造參數(shù)中,我們使用的隊列,一定要注意其特性和邊界。 我曾經(jīng)對自己的小弟說,如果你實在搞不清楚什么時候用HashMap,什么時候用ConcurrentHashMap,那么就用后者,你的代碼bug會很少。...
摘要:線程池的作用降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的資源浪費。而高位的部分,位表示線程池的狀態(tài)。當(dāng)線程池中的線程數(shù)達(dá)到后,就會把到達(dá)的任務(wù)放到中去線程池的最大長度。默認(rèn)情況下,只有當(dāng)線程池中的線程數(shù)大于時,才起作用。 線程池的作用 降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的資源浪費。 提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時,不需要等到線程創(chuàng)建就能立即執(zhí)行...
摘要:用于限定中線程數(shù)的最大值。該線程池中的任務(wù)隊列維護(hù)著等待執(zhí)行的對象。線程池和消息隊列筆者在實際工程應(yīng)用中,使用過多線程和消息隊列處理過異步任務(wù)。以上是筆者在學(xué)習(xí)實踐之后對于多線程和消息隊列的粗淺認(rèn)識,初學(xué)者切莫混淆兩者的作用。 多線程編程很難,難點在于多線程代碼的執(zhí)行不是按照我們直覺上的執(zhí)行順序。所以多線程編程必須要建立起一個宏觀的認(rèn)識。 線程池是多線程編程中的一個重要概念。為了能夠更...
閱讀 1683·2021-10-13 09:39
閱讀 3154·2021-10-12 10:11
閱讀 549·2021-09-28 09:36
閱讀 2633·2019-08-30 15:55
閱讀 1384·2019-08-30 13:04
閱讀 621·2019-08-29 17:08
閱讀 1900·2019-08-29 14:14
閱讀 3399·2019-08-28 18:23