在java里, 我們可以使用Executors.newFixedThreadPool 來創建線程池, 然後就可以不停的創建新任務,並用線程池來執行了。 在提交任務時,如果線程池已經被占滿,任務會進到一個隊列里等待執行。 這種機制在一些特定情況下會有些問題。今天我就遇到一種情況:創建線程比線程執行的速 ...
在java里, 我們可以使用Executors.newFixedThreadPool 來創建線程池, 然後就可以不停的創建新任務,並用線程池來執行了。
在提交任務時,如果線程池已經被占滿,任務會進到一個隊列里等待執行。
這種機制在一些特定情況下會有些問題。今天我就遇到一種情況:創建線程比線程執行的速度要快的多,而且單個線程占用的記憶體又多,所以很快記憶體就爆了。
想了一個辦法,就是在提交任務之前,先檢查目前正在執行的線程數目,只有沒把線程池占滿的時候在去提交任務。
代碼很簡單:
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