在java里, 我們可以使用Executors.newFixedThreadPool 來創(chuàng)建線程池, 然后就可以不停的創(chuàng)建新任務(wù),并用線程池來執(zhí)行了。
在提交任務(wù)時(shí),如果線程池已經(jīng)被占滿,任務(wù)會(huì)進(jìn)到一個(gè)隊(duì)列里等待執(zhí)行。
這種機(jī)制在一些特定情況下會(huì)有些問題。今天我就遇到一種情況:創(chuàng)建線程比線程執(zhí)行的速度要快的多,而且單個(gè)線程占用的內(nèi)存又多,所以很快內(nèi)存就爆了。
想了一個(gè)辦法,就是在提交任務(wù)之前,先檢查目前正在執(zhí)行的線程數(shù)目,只有沒把線程池占滿的時(shí)候在去提交任務(wù)。
代碼很簡(jiǎn)單:
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線程池:獲取運(yùn)行線程數(shù)并控制線程啟動(dòng)速度的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。