虽然这个主题已经在其他帖子中被广泛讨论过了,但我想展示我的用例并澄清一下。如果我浪费了任何人的时间,我深表歉意。我有以下可运行的实现。基本上是无限运行的线程,除非 java.lang.Error
被业务逻辑抛出。
public void run (){
while(true){
try{
//business logic
}catch(Exception ex){
}
}
}
我有大约30以上的线程从executorservice开始。
private final ExecutorService normalPriorityExecutorService = Executors.newFixedThreadPool(30);
for(int i=0;i<30;i++) {
normalPriorityExecutorService.submit(//Above Runnable);
}
如果这个executor服务上的线程计数变为零,我想检查并终止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
仍然是三十岁。
1条答案
按热度按时间nwo49xxi1#
由于您从未将线程池用作池,因此使用线程池是一种过分的做法。只需创建一个线程组并启动线程。