Я заметил, что мое 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
Теперь вопрос: ЧТО эти потоки ждут? У меня есть подозрительный класс, который, кажется, порождают эти потоки, но я не знаю, что именно заставляет эти потоки зависать.
Могу ли я что-нибудь сделать, чтобы найти причину этого, кроме разрыва класса построчно и продолжения наблюдения за поведением потока?
На tomcat они обычно запрашивают рабочие потоки, ожидающие подключения. Не о чем беспокоиться. Они готовы обрабатывать эти 100 пользователей, одновременно подключающихся к вашему серверу.
Эти темы являются частью ThreadPool. Более конкретно java.util.concurrent.ThreadPoolExecutor. Поток ожидает Runnable / Callable для отправки в пул. Например,
ExecutorService e = Executors.newFixedThreadPool(10);
создаст 10 потоков, которые будут ждать до
e.submit(new Runnable(){
public void run(){ ...}
});
. Тогда один поток будет уведомлен и вызовет этот работающий объект. Для чего они используются, я не могу сказать. Вам нужно выяснить, с чего начался пул потоков. Возможно, он обрабатывает запросы клиентов к серверу приложений.