Активные потоки в ExecutorService
любые идеи, как определить количество активных потоков в настоящее время работает в ExecutorService?
6 ответов:
использовать ThreadPoolExecutor реализация и вызов getActiveCount () на:
int getActiveCount() // Returns the approximate number of threads that are actively executing tasks.интерфейс ExecutorService не предоставляет метод для этого, это зависит от реализации.
предполагая, что
pool- это имя экземпляра ExecutorService:if (pool instanceof ThreadPoolExecutor) { System.out.println( "Pool size is now " + ((ThreadPoolExecutor) pool).getActiveCount() ); }
Проверьте исходный код для исполнителей.newFixedThreadPool():
return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());ThreadPoolExecutor имеет метод getActiveCount (). Таким образом, Вы можете либо привести ExecutorService к ThreadPoolExecutor, либо использовать приведенный выше код непосредственно для его получения. Затем можно вызвать getActiveCount ().
интерфейс 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, а не использовать фабрику исполнителей, которая возвращает объекты 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()); } }
у меня была такая же проблема, поэтому я создал простой запуск для отслеживания экземпляра 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));
поместите статический счетчик летучести на поток, который обновляется всякий раз, когда поток активируется и деактивируется. См. также API-интерфейс.
Comments