【问题标题】:Removing idle threads from thread pool in Java?从Java中的线程池中删除空闲线程?
【发布时间】:2016-04-19 23:54:45
【问题描述】:

我正在使用固定大小的 Java 线程池 (ExecutorService)。假设我向线程池提交了一个作业并且该作业空闲。

是否有可能从线程池中删除空闲作业,以便处理队列中的其他作业,然后再添加空闲作业?

【问题讨论】:

  • “空闲”是什么意思?任务在完成之前不会产生线程。执行者不会“抢占”它。所以如果你在那里wait,它仍然会消耗池中的一个线程。
  • 线程管理是池的工作,而不是你的工作。设置池并让它完成工作。
  • 删除空闲线程将否定object pool pattern(除非池管理它)。
  • 线程可能被删除。如果线程抛出异常,它将被删除并替换为新线程。 (另外,你说的是“固定大小”。有些线程池不是固定大小的,会自己删除空闲线程。)

标签: java multithreading threadpool executorservice


【解决方案1】:

如果你从ExecutorService移动到ThreadPoolExecutor,你可以用下面的API实现它

public void setCorePoolSize(int corePoolSize)

设置核心线程数。这会覆盖构造函数中设置的任何值。如果新值小于当前值,多余的现有线程将在下次空闲时终止。

如果更大,将在需要时启动新线程以执行任何排队的任务。

如果您想在运行时重新调整池的大小,

((ThreadPoolExecutor)service).setCorePoolSize(newLimit); //newLimit 是池的新大小

其他 API:

public void setMaximumPoolSize(int maximumPoolSize)

设置允许的最大线程数。这会覆盖构造函数中设置的任何值。如果新值小于当前值,多余的现有线程将在下次空闲时终止。

【讨论】:

  • 感谢您提供有用的信息....您在 10 个月内获得了 6.5K 的声誉.. 非常棒的先生...您在哪里工作,兄弟.. 我在班格罗尔工作。
  • 我有点沉迷于 stackoverflow 连续 283 天访问它。水力。
【解决方案2】:

任务或Runnable 可能在idle 中(我想等待 I/O 或其他资源)是主要原因之一,因为它适合使用线程池。

另一方面,您想要使用的线程数量是您需要调整的,以便在某些线程被阻塞等待资源时允许处理任务。

您唯一需要做的就是观察线程进入空闲状态的频率并相应地调整线程数量。

调整线程池的指南(来自:IBM ThreadPools and Work Queue

不要将同步等待其他任务结果的任务排队。这可能导致上述形式的死锁,其中所有线程都被任务占用,而这些任务又在等待队列任务的结果,这些任务由于所有线程都忙而无法执行。

将池线程用于可能长期存在的操作时要小心。如果程序必须等待资源,例如 I/O 完成,请指定最大等待时间,然后失败或重新排队任务以供稍后执行。这保证了通过为可能成功完成的任务释放线程来最终取得一些进展。

了解您的任务。要有效地调整线程池大小,您需要了解正在排队的任务以及它们在做什么。它们受 CPU 限制吗?它们是否受 I/O 限制?您的答案将影响您调整应用程序的方式。如果您有不同类别的任务具有完全不同的特征,那么为不同类型的任务设置多个工作队列可能是有意义的,因此可以相应地调整每个池。

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 2019-08-18
    • 1970-01-01
    • 2021-10-15
    • 2019-12-03
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多