我有一个 ExecutorService
来并发执行我的任务。这些任务中的大多数都是简单的操作,每个操作需要大约 300 毫秒才能完成。但是其中一些任务是后台处理队列,它们一直接收新的子任务并按顺序执行它们。只要有正常任务在运行,这些后台任务就会保持 Activity 状态。
ThreadPool 是通过 Executors
方法之一(目前还不知道是哪个)生成的,具有用户指定的线程数。我担心可能会发生以下情况:线程数少于后台队列数。在给定时刻,所有后台队列都在工作,阻塞 ExecutorService
的所有线程。因此,不会启动任何正常任务,程序将永远挂起。
是否有可能发生这种情况,我该如何避免?我正在考虑中断后台任务以将位置留给正常任务的可能性。
目标是限制我的应用程序中的线程数量,因为 Google 表示拥有大量线程是不好的,而且让它们在大部分时间处于空闲状态也很糟糕。
在程序开始执行时,将在很短的时间内提交约 10000 个任务。大约需要 50 个后台任务队列,大部分时间将花在等待后台作业上。
最佳答案
不要在同一个 ExecutorService
中混淆长时间运行的任务和短期运行的任务。
使用两个具有正确池大小的不同 ExecutorService
实例。即使您将具有长时间运行任务的后台线程的大小设置为 50,池的性能也不是最佳的,因为可用内核的数量(2 核、4 核、8 核等)不在该数量内。
我想创建两个单独的 ExecutorService
,用 Runtime.getRuntime().availableProcessors()/2
初始化;
查看以下帖子以了解更多详细信息以有效利用可用内核:
How to implement simple threading with a fixed number of worker threads
关于java - 我可以在 ThreadPool 中运行后台任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43318074/