it-swarm-ru.tech

Активные темы в ExecutorService

Любые идеи, как определить количество активных потоков, работающих в настоящее время в ExecutorService ?

57
zanussi

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

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

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

63
Daan

Предполагая, что pool является именем экземпляра ExecutorService:

if (pool instanceof ThreadPoolExecutor) {
    System.out.println(
        "Pool size is now " +
        ((ThreadPoolExecutor) pool).getActiveCount()
    );
}
23
andyroid

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

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

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

21
Arno

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

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

Доступен в классе ThreadPoolExecutor

 импорт Java.util.concurrent.LinkedBlockingQueue; 
 импорт Java.util.concurrent.ThreadPoolExecutor; 
 импорт Java.util.concurrent.TimeUnit; 
 
 
 открытый класс PoolSize {
 
 открытый статический 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, которая создает потоки в известной группе потоков, которую вы затем можете сосчитать

 импорт Java.util.concurrent.ExecutorService; 
 импорт Java.util.concurrent.Executors; 
 импорт Java.util.concurrent.ThreadFactory; 
 
 
 открытый класс PoolSize2 {
 
 открытый статический void main (String [] args) {
 final ThreadGroup threadGroup = new ThreadGroup ("working"); 
 
 ExecutorService executor = Executors.newCachedThreadPool (new ThreadFactory () {
 Общедоступная тема newThread (Runnable r) {
 Вернуть новую тему (threadGroup, r); 
} 
}); 
 
 System.out.println (threadGroup.activeCount ()); 
} 
} 
10
Dave Cheney

У меня была та же проблема, поэтому я создал простой Runnable для отслеживания экземпляра ExecutorService.

import Java.util.concurrent.ExecutorService;
import Java.util.concurrent.ThreadPoolExecutor;

public class ExecutorServiceAnalyzer implements Runnable
{
    private final ThreadPoolExecutor threadPoolExecutor;
    private final int timeDiff;

    public ExecutorServiceAnalyzer(ExecutorService executorService, int timeDiff)
    {
        this.timeDiff = timeDiff;
        if (executorService instanceof ThreadPoolExecutor)
        {
            threadPoolExecutor = (ThreadPoolExecutor) executorService;
        }
        else
        {
            threadPoolExecutor = null;
            System.out.println("This executor doesn't support ThreadPoolExecutor ");
        }

    }

    @Override
    public void run()
    {
        if (threadPoolExecutor != null)
        {
            do
            {
                System.out.println("#### Thread Report:: Active:" + threadPoolExecutor.getActiveCount() + " Pool: "
                        + threadPoolExecutor.getPoolSize() + " MaxPool: " + threadPoolExecutor.getMaximumPoolSize()
                        + " ####");
                try
                {
                    Thread.sleep(timeDiff);
                }
                catch (Exception e)
                {
                }
            } while (threadPoolExecutor.getActiveCount() > 1);
            System.out.println("##### Terminating as only 1 thread is active ######");
        }

    }
}

Вы можете просто использовать это с вашим исполнителем, чтобы получить состояния ThreadPool

Ex

ExecutorService executorService = Executors.newFixedThreadPool(4);
    executorService.execute(new ExecutorServiceAnalyzer(executorService, 1000));
4
Ankit Katiyar