ExecutorService中的活动线程

zan*_*ssi 60 java concurrency multithreading

任何想法如何确定当前运行的活动线程数ExecutorService

Daa*_*aan 64

使用ThreadPoolExecutor实现并在其上调用getActiveCount():

int getActiveCount() 
// Returns the approximate number of threads that are actively executing tasks.
Run Code Online (Sandbox Code Playgroud)

ExecutorService接口没有提供相应的方法,它取决于实现.


小智 26

假设pool是ExecutorService实例的名称:

if (pool instanceof ThreadPoolExecutor) {
    System.out.println(
        "Pool size is now " +
        ((ThreadPoolExecutor) pool).getActiveCount()
    );
}
Run Code Online (Sandbox Code Playgroud)


小智 21

检查Executors.newFixedThreadPool()的源代码:

return new ThreadPoolExecutor(nThreads, nThreads,
                              0L, TimeUnit.MILLISECONDS,
                              new LinkedBlockingQueue<Runnable>());
Run Code Online (Sandbox Code Playgroud)

ThreadPoolExecutor有一个getActiveCount()方法.因此,您可以将ExecutorService转换为ThreadPoolExecutor,或者直接使用上面的代码来获取一个.然后,您可以调用getActiveCount().


Dav*_*ney 10

ExecutorService接口没有定义检查池中工作线程数的方法,因为这是一个实现细节

public int getPoolSize()
Returns the current number of threads in the pool.
Run Code Online (Sandbox Code Playgroud)

可以在ThreadPoolExecutor类中使用

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class PoolSize {

    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 20, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
        System.out.println(executor.getPoolSize());
    }
}

但这需要您显式创建ThreadPoolExecutor,而不是使用返回ExecutorService对象的Executors工厂.你总是可以创建自己的工厂来返回ThreadPoolExecutors,但是你仍然会遇到使用具体类型的错误形式,而不是它的界面.

一种可能性是提供自己的ThreadFactory,它在已知的线程组中创建线程,然后您可以对其进行计数

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;


public class PoolSize2 {

    public static void main(String[] args) {
        final ThreadGroup threadGroup = new ThreadGroup("workers");

        ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() {
            public Thread newThread(Runnable r) {
                return new Thread(threadGroup, r);
            }
        });

        System.out.println(threadGroup.activeCount());
    }
}