【发布时间】:2020-11-27 06:47:52
【问题描述】:
虽然这个话题已经在其他帖子中广泛讨论过,但我想展示我的用例并澄清一下。如果我浪费了任何人的时间,我深表歉意。我有以下可运行的实现。除非java.lang.Error 被业务逻辑抛出,否则基本上是无限运行的线程。
public void run (){
while(true){
try{
//business logic
}catch(Exception ex){
}
}
}
我从 ExecutorService 启动了大约 30 个上述线程。
private final ExecutorService normalPriorityExecutorService = Executors.newFixedThreadPool(30);
for(int i=0;i<30;i++) {
normalPriorityExecutorService.submit(//Above Runnable);
}
如果这个 Executor Service 上的线程计数变为零,我想检查并终止 JVM 进程。
if (normalPriorityExecutorService instanceof ThreadPoolExecutor && ((ThreadPoolExecutor) normalPriorityExecutorService).getActiveCount() ==0) {
log.error("No Normal Priority response listeners available. Shutting down App!");
System.exit(1);
}
根据我的阅读,由于这些可运行线程在正常情况下无限运行,因此我将激活其中的 30 个,除非它们被运行时错误杀死。
问题是针对我的用例使用getActiveCount() 的正确方法吗?顺便说一句,当我尝试使用 getPoolSize() 而不是 getActiveCount() 时,我在测试时没有得到正确的行为(我强行抛出错误以杀死特定线程)并且 poolSize 仍然保持 30。
【问题讨论】:
标签: java multithreading executorservice