【问题标题】:ThreadPool getActiveCount() vs getPoolSize()ThreadPool getActiveCount() 与 getPoolSize()
【发布时间】: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


    【解决方案1】:

    由于您从不将线程池用作池,因此使用线程池是大材小用。只需创建一个线程组并启动您的线程。

    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);
    }
    

    【讨论】:

    • 你好安德烈亚斯 - 谢谢。只是好奇你为什么说'你从不将线程池用作池'。我的理解是执行器服务的工作是在我们根据侦听器的数量决定我们想要什么样的线程池之后管理线程池。我错过了什么?顺便说一句,我得到了活动计数的想法,到目前为止,它似乎在较低的环境中运行良好。
    • @user7246161 池是存储对象以供重复使用的东西,因此更少的对象可以帮助/服务更多用途。当对象“昂贵”时很有用,例如金钱(汽车池中的车辆)、性能(连接池、线程池,因为数据库连接和线程启动都很慢)和资源管理(线程数限制)。您的代码预先建立了 30 个线程,然后从不重复使用线程,因此代码没有使用线程池的池方面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2010-10-02
    • 2023-04-04
    相关资源
    最近更新 更多