线程池getactivecount()与getpoolsize()

xkftehaa  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(474)

虽然这个主题已经在其他帖子中被广泛讨论过了,但我想展示我的用例并澄清一下。如果我浪费了任何人的时间,我深表歉意。我有以下可运行的实现。基本上是无限运行的线程,除非 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 仍然是三十岁。

nwo49xxi

nwo49xxi1#

由于您从未将线程池用作池,因此使用线程池是一种过分的做法。只需创建一个线程组并启动线程。

private final ThreadGroup normalPriorityThreadGroup = new ThreadGroup("NormalPriority");
for (int i = 0; i < 30; i++) {
    new Thread(this.normalPriorityThreadGroup, runnable, "NormalPriority-" + 1).start();
}
if (this.normalPriorityThreadGroup.activeCount() == 0) {
    log.error("No Normal Priority response listeners available. Shutting down App!");
    System.exit(1);
}

相关问题