Интерфейс ExecutorService не определяет метод для проверки количества рабочих потоков в пуле, так как это деталь реализации
public int getPoolSize()
Returns the current number of threads in the pool.
Доступно для класса 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, а не использовать фабрику Executors, которая возвращает объекты ExecutorService. Вы всегда можете создать свою собственную фабрику, которая возвращает 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());
}
}