java我可以在线程池中运行后台任务吗?
我有一个ExecutorService
来同时执行我的任务。这些任务中的大多数都是简单的操作,需要约300毫秒才能完成。但其中一些任务是后台处理队列,它们始终接收新的子任务并按顺序执行。只要有正常任务在运行,这些后台任务将保持活动状态
线程池是通过一个Executors
方法(还不知道是哪个)生成的,该方法具有用户指定的线程计数。我担心会发生以下情况:线程数少于后台队列数。在给定时刻,所有后台队列都在工作,阻塞了ExecutorService
的所有线程。因此,不会启动任何正常任务,程序将永远挂起
这是否有可能发生,我如何避免?我在考虑一种可能性,中断后台任务,把这个地方留给正常的地方
我们的目标是限制我的应用程序中的线程数量,因为谷歌说有很多线程是不好的,让它们在大部分时间处于空闲状态也是不好的
在程序开始执行时,将在很短的时间内提交约10000个任务。大约需要50个后台任务队列,大部分时间将用于等待后台任务完成
# 1 楼答案
不要把长时间运行的任务和短时间运行的任务混为一谈
使用两个池大小合适的
ExecutorService
实例。即使将具有长时间运行任务的后台线程的大小设置为50,池的性能也不是最佳的,因为可用的核心数(2核、4核、8核等)不在该数目之内我想创建两个单独的
ExecutorService
初始化为Runtime.getRuntime().availableProcessors()/2
请查看下面的帖子,了解有效利用可用核心的更多细节:
How to implement simple threading with a fixed number of worker threads
Dynamic Thread Pool
# 2 楼答案
你可以拥有无限数量的线程,请查看cache thread pool
另一个选项是创建两个不同的池,并为优先任务保留一个池
# 3 楼答案
解决方案是,当没有工作时,后台任务停止而不是空闲,如果再次有足够的任务,则重新启动