为了账号安全,请及时绑定邮箱和手机立即绑定

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条经验 获得超4个赞

我想知道这是否是常见行为,或者在某些时候存在内存泄漏并且会爆炸。它不应该重用以前的池吗?

好吧,您一直在显式创建新池。

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

至于内存泄漏,因为您要关闭池,所以应该没问题(但是为了finally安全起见,以防万一)。

如果你想重新使用池(这很有意义),你应该为threads你创建一个实例变量Processor(并确保在关闭方法中Processor implements AutoCloseable关闭它)。threads


查看完整回答
反对 回复 2023-04-13
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您正在调用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条经验 获得超7个赞

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



查看完整回答
反对 回复 2023-04-13
  • 3 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信