Я использую ThreadPoolExecutor для запуска потоков, обрабатывающих запросы из очереди блокировки. В случае, если очередь пуста, все эти рабочие потоки ждут. что делает каждый поток в этом пуле в состоянии ожидания.Как получить текущие потоки
public ThreadPoolExecutor executor = new ThreadPoolExecutor(
EngineConfiguration.numberOfSearchTask,
EngineConfiguration.numberOfSearchTask + 10, 1000,
TimeUnit.SECONDS, worksQueue, executionHandler);
Я также начал ниже запланированного executore, который пытается получить текущие активные темы в вышеуказанном бассейне, и когда он равен 0, то это выключит бассейн:
final ScheduledFuture<?> scheduleFuture = scheduler
.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
int activeThreadCount = executor.getActiveThreads();
if (activeThreadCount == 0) {
SearchTaskRunner.keepRunning.set(false);
log.warn("shutdown task runner");
executor.shutdown();
log.warn("shutdown scheduler");
scheduler.shutdownNow();
}
}
}, 10, 10000, TimeUnit.SECONDS);
Проблема в том, что после 10 секунд , поток планировщика получает activeThreadCount = 0 и, следовательно, отключает пулы.
мы знаем, что:
getActiveCount(): Возвращает приблизительное количество потоков, которые активно выполнения задач.
Это может не дать точное количество потоков в активном состоянии.
В любом случае я узнаю, все ли мои потоки из первого пула находятся в состоянии ожидания?
, к счастью, я нашел http://stackoverflow.com/questions/5572865/number-of -active-tasks-using-threadpoolexecutor, который описывает хорошую логику. он решил мою проблему. –