猿问

ExecutorService每次给一个新的线程池有什么问题吗?

我有以下代码,每次针对不同数量的线程执行:


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()电话


人到中年有点甜
浏览 122回答 3
3回答

收到一只叮咚

我想知道这是否是常见行为,或者在某些时候存在内存泄漏并且会爆炸。它不应该重用以前的池吗?好吧,您一直在显式创建新池。//&nbsp;this&nbsp;creates&nbsp;a&nbsp;new&nbsp;pool final&nbsp;ExecutorService&nbsp;threads&nbsp;=&nbsp;Executors.newFixedThreadPool(col.size());至于内存泄漏,因为您要关闭池,所以应该没问题(但是为了finally安全起见,以防万一)。如果你想重新使用池(这很有意义),你应该为threads你创建一个实例变量Processor(并确保在关闭方法中Processor implements AutoCloseable关闭它)。threads

红颜莎娜

您正在调用Executors.newFixedThreadPool()您的函数,它创建了一个新的线程池。这本身并没有错,但并不常见,并且与使用线程池背后的许多动机背道而驰。一种更标准的方法是在您的Processor类中创建一个线程池,并将作业分配给它,如下所示:class Processor {&nbsp; &nbsp; private final ExecutorService service = Executors.newFixedThreadExecutor(count);&nbsp; &nbsp; private void doStuff() {&nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; &nbsp; service.submit(() -> w.process());&nbsp; &nbsp; }}

qq_遁去的一_1

拥有线程池的想法是限制您正在创建的线程数量并重用已经创建的线程,以避免在给定时间不必要地拥塞处理大量线程并提高效率。现在您的代码的问题是它既不限制线程数也不重用。由于您只进行一些打印,因此您可能看不到拥塞,但如果您在 worker 中添加更多处理并继续并行调用它,那么您将看到完成处理的严重延迟。
随时随地看视频慕课网APP

相关分类

Java
我要回答