如何監控線程池?
現在很多公司開始重視線程池的使用情況,所以掌握監控線程池很有必要。線程池一共有兩個點需要監控,第一個點是線程的變化情況,
第二個點是任務的變化情況。
上面這三個方法是用來監控線程的變化情況。
下面這三個方法是用來監控任務的變化情況,
接下來自定義一個帶監控功能的線程池,然后繼承threadPoolExecutor,接着重載構造方法。
另一個監控功能的方法,
monitor依次監控正在工作的線程數和當前存在的線程數,以及歷史最大的線程數,這三個是與線程變化相關的。
接着依次監控已提交的任務數和已完成的任務數,以及隊列中的任務數,這三個是與任務變化相關的。至此監控方法編寫完成,
重寫before executor方法,該方法每次任務執行前調用,在他內部調用一遍monitor方法,每當有任務執行的時候,輸出一次線程池的情況,
接着重寫afterexecutor方法,該方法每次任務完成后調用,在它內部也調用一遍monitor方法,每當有任務完成的時候,輸出一次線程池的情況,
最后重寫terminated的方法。該方法在線程池關閉前調用,同樣的,在它的內部也調用一遍monitor方法,
當線程池關閉前一刻,我們可以了解到線程池最后的情況,至此整個帶監控功能的線程池編寫完成,
下面來試試它。
制定一個任務task,實現runnable接口,定義一個int類型的變量timeout,表示任務執行時長,重載構造方法用於初始化timeout,任務內容是使當前線程休眠,以此來模擬任務執行時長。
接下來使用帶監控功能的線程池,執行該任務。首先創建一個帶監控功能的限制值,並指定核心線程數為1,最大線程數為三,空閑線程存活時間為0秒,任務隊列采用linkedblockingqueue,並指定隊列長度為二,接着使用for循環。從5~1提交5個任務,創建任務並指定任務執行時長為I,接着提交任務,每隔500毫秒提交一個,sleep方法有異常拋出使用try---catch將其捕獲。
任務提交完以后,我們使主線程休眠6秒鍾,這樣做的目的在於,想在關閉線程池之前獲取一次線程池的情況,最后寫上finally代碼塊,在finally代碼塊中調用shoudown方法關閉線程池。至此main方法編寫完成,
整個例子也編寫完成。執行程序,
觀察執行結果。從執行結果來看,
線程池各項參數的變化情況一目了然。
總結
最后總結一下本節內容,本節介紹了如何監控線程池,利用這6個方法就可以實現對象征值的監控,在實際開發中當然不是把這些參數打印出來,而是寫在日志中或者是寫在服務器某塊地方,通過客戶端可以隨時查看。
附錄:
筆記完整文本:
現在很多公司開始重視線程池的使用情況,所以掌握監控線程池很有必要。線程池一共有兩個點需要監控,第一個點是線程的變化情況,第二個點是任務的變化情況。上面這三個方法是用來監控線程的變化情況。下面這三個方法是用來監控任務的變化情況,接下來自定義一個帶監控功能的線程池,然后繼承threadPoolExecutor,接着重載構造方法。另一個監控功能的方法,monitor依次監控正在工作的線程數和當前存在的線程數,以及歷史最大的線程數,這三個是與線程變化相關的。 接着依次監控已提交的任務數和已完成的任務數,以及隊列中的任務數,這三個是與任務變化相關的。至此監控方法編寫完成,重寫before executor方法,該方法每次任務執行前調用,在他內部調用一遍monitor方法,每當有任務執行的時候,輸出一次線程池的情況,接着重寫afterexecutor方法,該方法每次任務完成后調用,在它內部也調用一遍monitor方法,每當有任務完成的時候,輸出一次線程池的情況,最后重寫terminated的方法。該方法在線程池關閉前調用,同樣的,在它的內部也調用一遍monitor方法,當線程池關閉前一刻,我們可以了解到線程池最后的情況,至此整個帶監控功能的限制池編寫完成,下面來試試它。 制定一個任務task,實現runnable接口,定義一個int類型的變量timeout,表示任務執行時長,重載構造方法用於初始化timeout,任務內容是使當前線程休眠,以此來模擬任務執行時長。接下來使用帶監控功能的線程池,執行該任務。首先創建一個帶監控功能的限制值,並指定核心線程數為1,最大線程數為三,空閑線程存活時間為0秒,任務隊列采用linkedblockingqueue,並指定隊列長度為二,接着使用for循環。從5~1提交5個任務,創建任務並指定任務執行時長為I,接着提交任務,每隔500毫秒提交一個,sleep方法有異常拋出使用try---catch將其捕獲。 任務提交完以后,我們使主線程休眠6秒鍾,這樣做的目的在於,想在關閉線程池之前獲取一次線程池的情況,最后寫上finally代碼塊,在finally代碼塊中調用shoudown方法關閉線程池。至此main方法編寫完成,整個例子也編寫完成。執行程序,觀察執行結果。從執行結果來看,線程池各項參數的變化情況一目了然。最后總結一下本節內容,本節介紹了如何監控線程池,利用這6個方法就可以實現對象征值的監控,在實際開發中當然不是把這些參數打印出來,而是寫在日志中或者是寫在服務器某塊地方,通過客戶端可以隨時查看。