3 回答

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

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
您正在調(diào)用Executors.newFixedThreadPool()您的函數(shù),它創(chuàng)建了一個(gè)新的線程池。
這本身并沒(méi)有錯(cuò),但并不常見(jiàn),并且與使用線程池背后的許多動(dòng)機(jī)背道而馳。一種更標(biāo)準(zhǔn)的方法是在您的Processor類中創(chuàng)建一個(gè)線程池,并將作業(yè)分配給它,如下所示:
class Processor {
private final ExecutorService service = Executors.newFixedThreadExecutor(count);
private void doStuff() {
...
...
service.submit(() -> w.process());
}
}

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
擁有線程池的想法是限制您正在創(chuàng)建的線程數(shù)量并重用已經(jīng)創(chuàng)建的線程,以避免在給定時(shí)間不必要地?fù)砣幚泶罅烤€程并提高效率?,F(xiàn)在您的代碼的問(wèn)題是它既不限制線程數(shù)也不重用。由于您只進(jìn)行一些打印,因此您可能看不到擁塞,但如果您在 worker 中添加更多處理并繼續(xù)并行調(diào)用它,那么您將看到完成處理的嚴(yán)重延遲。
添加回答
舉報(bào)