2013-03-04 3 views
0

Я использую 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(): Возвращает приблизительное количество потоков, которые активно выполнения задач.

Это может не дать точное количество потоков в активном состоянии.

В любом случае я узнаю, все ли мои потоки из первого пула находятся в состоянии ожидания?

+0

, к счастью, я нашел http://stackoverflow.com/questions/5572865/number-of -active-tasks-using-threadpoolexecutor, который описывает хорошую логику. он решил мою проблему. –

ответ

2

использование этого

Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); 
+0

Он возвращает все потоки (= 8) в процессе: 'Выполнение потока: {Thread [main, 5, main] = [Ljava.lang.StackTraceElement; @ 1f0dc656, Thread [Thread-1,5, main] = [ Ljava.lang.StackTraceElement; @ 41584807, Thread [Диспетчер сигналов, 9, система] = [Ljava.lang.StackTraceElement; @ ae0e515, Thread [пул-2-нить-1,5, основной] = [Ljava.lang.StackTraceElement ; @ 32, Thread [Finalizer, 8, system] = [Ljava.lang.StackTraceElement; @ 29, Thread [пул-1-thread-1,5, main] = [Ljava.lang.StackTraceElement; @ 7c, Thread [ Reference Handler, 10, system] = [Ljava.lang.StackTraceElement; @ 1, Thread [Keep-Alive-Timer, 8, system] = [Ljava.lang.StackTraceElement; @ 12} ' –

+0

к счастью, я нашел http: // stackoverflow.com/questions/5572865/number-of-active-tasks-using-threadpoolexecutor, который описывает хорошую логику. он решил мою проблему. Спасибо PSR за то, что вы первая помощь! –

0

Используйте этот код, чтобы получить все запущенные потоки и преобразовать набор в массив

Set<Thread> tSet = Thread.getAllStackTraces().keySet(); 
Thread[] tArray = tSet.toArray(new Thread[tSet.size()]);