亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ExecutorService每次給一個新的線程池有什么問題嗎?

ExecutorService每次給一個新的線程池有什么問題嗎?

人到中年有點甜 2023-04-13 10:35:17
我有以下代碼,每次針對不同數量的線程執行:class Worker<T> {  public void process() {      System.out.pritnln("Test");  }}class Processor {  private void doStuff(final Collection<Worker<V>> col) {    final int size = col.size();    if (size > 0) {      final ExecutorService threads = Executors.newFixedThreadPool(col.size());      for (Worker<V> w : col) {        threads.submit(() -> w.process());      }      threads.shutdown();    }  }}每次都在新的民意調查標識符中打?。?pool-66-thread-1) 測試(pool-66-thread-2) 測試(pool-67-thread-1) 測試(pool-68-thread-1) 測試(pool-68-thread-3) 測試(pool-68-thread-2) 測試我想知道這是否是常見的行為,或者在某個時候發生內存泄漏并且它會爆炸。它不應該重用 previous 嗎pools?我怎么看,那些以前的池子已經shutdown多虧了threads.shutdown()電話
查看完整描述

3 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

我想知道這是否是常見行為,或者在某些時候存在內存泄漏并且會爆炸。它不應該重用以前的池嗎?

好吧,您一直在顯式創建新池。

// this creates a new pool
final ExecutorService threads = Executors.newFixedThreadPool(col.size());

至于內存泄漏,因為您要關閉池,所以應該沒問題(但是為了finally安全起見,以防萬一)。

如果你想重新使用池(這很有意義),你應該為threads你創建一個實例變量Processor(并確保在關閉方法中Processor implements AutoCloseable關閉它)。threads


查看完整回答
反對 回復 2023-04-13
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

您正在調用Executors.newFixedThreadPool()您的函數,它創建了一個新的線程池。


這本身并沒有錯,但并不常見,并且與使用線程池背后的許多動機背道而馳。一種更標準的方法是在您的Processor類中創建一個線程池,并將作業分配給它,如下所示:


class Processor {

    private final ExecutorService service = Executors.newFixedThreadExecutor(count);


    private void doStuff() {

        ...

        ...

        service.submit(() -> w.process());

    }

}


查看完整回答
反對 回復 2023-04-13
?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

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



查看完整回答
反對 回復 2023-04-13
  • 3 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號