3 回答

TA貢獻1821條經驗 獲得超5個贊
我想知道這是否是常見行為,或者在某些時候存在內存泄漏并且會爆炸。它不應該重用以前的池嗎?
好吧,您一直在顯式創建新池。
// this creates a new pool final ExecutorService threads = Executors.newFixedThreadPool(col.size());
至于內存泄漏,因為您要關閉池,所以應該沒問題(但是為了finally
安全起見,以防萬一)。
如果你想重新使用池(這很有意義),你應該為threads
你創建一個實例變量Processor
(并確保在關閉方法中Processor implements AutoCloseable
關閉它)。threads

TA貢獻1842條經驗 獲得超13個贊
您正在調用Executors.newFixedThreadPool()您的函數,它創建了一個新的線程池。
這本身并沒有錯,但并不常見,并且與使用線程池背后的許多動機背道而馳。一種更標準的方法是在您的Processor類中創建一個線程池,并將作業分配給它,如下所示:
class Processor {
private final ExecutorService service = Executors.newFixedThreadExecutor(count);
private void doStuff() {
...
...
service.submit(() -> w.process());
}
}

TA貢獻1725條經驗 獲得超8個贊
擁有線程池的想法是限制您正在創建的線程數量并重用已經創建的線程,以避免在給定時間不必要地擁塞處理大量線程并提高效率?,F在您的代碼的問題是它既不限制線程數也不重用。由于您只進行一些打印,因此您可能看不到擁塞,但如果您在 worker 中添加更多處理并繼續并行調用它,那么您將看到完成處理的嚴重延遲。
添加回答
舉報