java - 我可以在 ThreadPool 中运行后台任务吗?

标签 java multithreading background-process executorservice

我有一个 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

Dynamic Thread Pool

关于java - 我可以在 ThreadPool 中运行后台任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43318074/

相关文章:

java - 无法在 firestore 中按字符串查询。 RuntimeException字段 "latitude"不是java.lang.String

c# - 从计时器线程调用 System.Timers.Timer.Stop

ios - 我的 NSXMLParser 在后台不工作

android - 从 Android 通知栏启动应用程序。如何启动一个新的应用程序实例而不是恢复后台进程?

java - 在节电模式 Android 上运行后台服务

java - Java 的 IndexOf 方法

java - Spring for Android 内存问题

java - JavaFX 中每 3 秒循环一次线程

python - 使用多个并行线程分部分下载大文件

java - 是否可以在 Android 模拟器上运行 viber