在Java中从线程池中删除空闲线程?

在Java中从线程池中删除空闲线程?,java,multithreading,threadpool,executorservice,Java,Multithreading,Threadpool,Executorservice,我正在使用一个固定大小的Java线程池(ExecutorService)。假设我向线程池提交了一个作业,而该作业处于空闲状态 是否有可能从线程池中删除空闲作业,以便处理队列中的其他作业,然后再次添加空闲作业?事实上,任务或可运行的任务可能处于空闲状态(我假设等待I/O或其他资源)是主要原因之一,因为它适合使用线程池 另一方面,您想要使用的线程数量是您需要调整的,以便在某些线程被阻塞等待资源时允许处理任务 您需要做的唯一一件事就是观察线程进入空闲状态的频率,并相应地调整线程的数量 优化线程池的指导

我正在使用一个固定大小的Java线程池(ExecutorService)。假设我向线程池提交了一个作业,而该作业处于空闲状态


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

事实上,任务或可运行的任务可能处于空闲状态(我假设等待I/O或其他资源)是主要原因之一,因为它适合使用线程池

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

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

优化线程池的指导原则(从:) 不要对同步等待其他任务结果的任务排队。这可能会导致上述形式的死锁,其中所有线程都被任务占用,而这些任务又在等待队列中的任务的结果,这些任务由于所有线程都很忙而无法执行

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

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


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

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

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

如果要在运行时重新调整池的大小

((ThreadPoolExecutor)服务).setCorePoolSize(newLimit)//newLimit是池的新大小

其他API:

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


你说的“空闲”是什么意思?任务在完成之前不会产生线程。执行人不会“先发制人”。因此,如果您在那里等待,它仍然会消耗池中的一个线程。线程管理是池的工作,而不是您的工作。设置池并让它完成工作。删除空闲线程将否定(除非池管理它)。可能会删除线程。如果一个线程抛出一个异常,它将被删除并替换为一个新线程。(还有,你说的是“固定大小”。一些线程池不是固定大小的,它们本身会删除空闲线程。)感谢提供有用的信息。。。。你在10个月内拥有6.5公里的声誉。。真的很好,先生。。。你在哪里工作,兄弟。。我在班格罗工作。我有点沉迷于连续283天的访问。路政署。
public void setMaximumPoolSize(int maximumPoolSize)