我们有一个方案,其中提交给ThreadPoolExecutor的任务长时间运行。启动线程池时,我们以核心池大小= 5,最大池大小= 20和队列大小10来启动它。在我们的应用程序中,大约提交了10个任务。大多数情况下,这些任务会运行几分钟/小时,然后完成。但是,有一种情况是所有5个任务都卡在I/O上。结果,我的核心池大小达到了最大值,但是我的Threadpoolexecutor队列未满。因此,额外的5个任务再也没有运行的机会。
请建议我们如何处理这种情况?在这种情况下,使用较小的队列会更好吗?初始化threadPool时最佳队列大小是多少?
此外,对于挂起的任务,有什么方法可以将线程从线程池中拉出来?在这种情况下,至少其他任务将有机会运行。
最佳答案
总体情况是这样的:
core pool size = 5,
max pool size = 20 and
queue size of 10
提交了10个任务。其中有
因此,您的程序已挂起。
要了解有关
ThreadPoolExecutor
的动态的更多信息,请观看here。该文档的主要注意事项如下:编辑
如果您希望增加核心池的大小,则可以使用 setCorePoolSize(int corePoolSize) 。如果增加
corepoolsize
,则如有需要,将启动新线程以执行所有排队的任务。