在java里, 我們可以使用Executors.newFixedThreadPool 來創(chuàng)建線程池, 然后就可以不停的創(chuàng)建新任務(wù),并用線程池來執(zhí)行了。
在提交任務(wù)時,如果線程池已經(jīng)被占滿,任務(wù)會進到一個隊列里等待執(zhí)行。
這種機制在一些特定情況下會有些問題。今天我就遇到一種情況:創(chuàng)建線程比線程執(zhí)行的速度要快的多,而且單個線程占用的內(nèi)存又多,所以很快內(nèi)存就爆了。
想了一個辦法,就是在提交任務(wù)之前,先檢查目前正在執(zhí)行的線程數(shù)目,只有沒把線程池占滿的時候在去提交任務(wù)。
代碼很簡單:
1
2
3
4
5
6
7
8
9
|
int threadCount = ((ThreadPoolExecutor)executor).getActiveCount(); // System.out.println("running : " + threadCount); while (threadCount == POOL_SIZE) { TimeUnit.MILLISECONDS.sleep( 1 ); threadCount = ((ThreadPoolExecutor)executor).getActiveCount(); // System.out.println("running : " + threadCount); } executor.execute |
以上這篇java線程池:獲取運行線程數(shù)并控制線程啟動速度的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。