Подтвердить что ты не робот

Поиск причины ожидания/спящих потоков

Я заметил, что мое приложение java (работает на tomcat6) генерирует много потоков, которые не завершаются.

Итак, я создал дамп потока и заметил, что есть тонны потоков, ожидающих, например:

"pool-1-thread-22" prio=5 tid=101b4b000 nid=0x127122000 waiting on condition [127121000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <6c340cee0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:680)
   Locked ownable synchronizers:
    - None

Теперь возникает вопрос: ЧТО ждут эти потоки? У меня есть подозрительный класс, который, кажется, порождает эти потоки, но я не знаю, что именно заставляет эти потоки застревать.

Есть ли что-нибудь, что я могу сделать, чтобы найти причину этого, кроме разрыва класса отдельно, и следить за поведением потока?

4b9b3361

Ответ 1

В tomcat они обычно запрашивают рабочие потоки, ожидая, что кто-то подключится. Не о чем беспокоиться. Они готовы обращаться к тем 100 пользователям, которые подключаются сразу к вашему серверу.

Ответ 2

Эти потоки являются частью ThreadPool. Более конкретно java.util.concurrent.ThreadPoolExecutor. Поток ожидает, когда Runnable/Callable будет отправлен в пул. Например

ExecutorService e = Executors.newFixedThreadPool(10);

Создает 10 потоков, которые будут ждать до

e.submit(new Runnable(){
  public void run(){ ...}
});

Затем один поток будет уведомлен и вызовет этот runnable. То, что они используют, я не могу сказать. Вам нужно будет узнать, что запустило пул потоков. Возможно, его обработка клиентских запросов на сервер приложений.