Java中如何从线程池中移除空闲线程?

3
我正在使用一个固定大小的Java线程池(ExecutorService)。假设我将一个任务提交到线程池中并且该任务变为空闲状态。
是否有可能从线程池中删除空闲任务,以便可以处理队列中的其他任务,然后稍后再次添加空闲任务?

“Idle”是什么意思?任务在完成之前不会释放线程。执行器不会“抢占”它。因此,如果您在其中使用wait,它仍将从池中消耗一个线程。 - Thilo
线程的管理是池的工作,而不是你的工作。设置好池,让它去完成工作。 - duffymo
移除空闲线程将会使对象池模式失效(除非池本身进行管理)。 - Elliott Frisch
可能会有线程被移除。如果一个线程抛出异常,它将被移除并替换为一个新的线程。(另外,你说“固定大小”。有些线程池不是固定大小的,它们会自行删除空闲线程。) - markspace
2个回答

5

如果您从ExecutorService转向ThreadPoolExecutor,您可以通过以下API实现:

public void setCorePoolSize(int corePoolSize)

设置核心线程数。这将覆盖构造函数中设置的任何值。如果新值小于当前值,则下次空闲时,多余的现有线程将被终止。如果更大,则必要时将启动新线程来执行任何排队的任务。
如果您想在运行时重新调整池的大小,
((ThreadPoolExecutor)service).setCorePoolSize(newLimit); //newLimit是池的新大小
其他API:
public void setMaximumPoolSize(int maximumPoolSize)

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


感谢提供有用的信息...您在10个月内获得了6.5K的声望..真的很棒,先生...你在哪里工作啊兄弟..我在班加罗尔工作。 - Anil Reddy Yarragonda
我有点沉迷于Stack Overflow,已经连续访问了283天。Hyd。 - Ravindra babu

3
一个任务或一个Runnable可能处于空闲状态(我想是在等待I/O或其他资源),这是使用线程池的主要原因之一。
另一方面,您需要调整要使用的线程数量,以便在一些线程因等待资源而阻塞时,任务可以被处理。
你需要做的唯一事情就是观察线程进入空闲状态的频率,并相应地调整线程数量。
调整ThreadPool的指南(来自: IBM ThreadPools and Work Queue
不要将等待其他任务结果的任务同步排队。这可能会导致上述形式的死锁,其中所有线程都忙于执行反过来正在等待无法执行的排队任务的结果。
使用池化线程进行潜在长时间操作时要小心。如果程序必须等待资源(例如I / O完成),请指定最大等待时间,然后失败或重新排队以在稍后执行。这确保最终通过为可能成功完成的任务释放线程来取得进展。
了解您的任务。为了有效地调整线程池大小,您需要了解正在排队和它们正在做什么的任务。它们是CPU绑定还是I / O绑定?您的答案将影响如何调整应用程序。如果您具有具有根本不同特征的不同任务类别,则为不同类型的任务拥有多个工作队列可能是有意义的,以便可以相应地调整每个池。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接