Активные потоки в ExecutorService

60
задан Markus Weninger 30 November 2017 в 16:15
поделиться

4 ответа

Используйте реализация ThreadPoolExecutor и вызов getActiveCount () на нем:

int getActiveCount() 
// Returns the approximate number of threads that are actively executing tasks.

интерфейс ExecutorService не предоставляет метод, для которого, он зависит от реализации.

64
ответ дан Daan 24 November 2019 в 17:42
поделиться

Проверьте исходный код на Executors.newFixedThreadPool ():

return new ThreadPoolExecutor(nThreads, nThreads,
                              0L, TimeUnit.MILLISECONDS,
                              new LinkedBlockingQueue<Runnable>());

ThreadPoolExecutor имеет getActiveCount () метод. Таким образом, Вы могли бы или бросить ExecutorService в ThreadPoolExecutor, одерское использование вышеупомянутый код непосредственно для получения того. Можно тогда вызвать getActiveCount ().

21
ответ дан Arno 24 November 2019 в 17:42
поделиться

Интерфейс ExecutorService не определяет метод для исследования количества рабочих потоков в пуле, поскольку это - деталь реализации

public int getPoolSize()
Returns the current number of threads in the pool.

, доступно на классе

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, Но это требует, чтобы Вы явно создали ThreadPoolExecutor, вместо того, чтобы использовали фабрику Исполнителей, которая возвращает объекты 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());
    }
}
10
ответ дан Dave Cheney 24 November 2019 в 17:42
поделиться

Поместите статический энергозависимый счетчик в поток, который обновляется каждый раз, когда поток активируется и деактивируется. Кроме того, посмотрите API.

-4
ответ дан Javaxpert 24 November 2019 в 17:42
поделиться