Trouver la cause de l'attente/les fils de couchage

j'ai remarqué que mon application java (fonctionne sur tomcat6) produit beaucoup de threads qui ne se terminent pas.

alors j'ai créé un dump de thread et j'ai remarqué qu'il y a des tonnes de threads qui attendent, comme ceci:

"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

maintenant la question Est: QU'est-ce que ces fils attendent? J'ai la classe suspecte qui semble engendrer ces fils, mais je ne sais pas exactement ce qui rend ces fils collés.

Est-ce que je peux faire pour trouver la cause de cette exception pour déchirer la classe ligne par ligne et continuer à surveiller le comportement du thread?

25
demandé sur Timo 2011-11-11 01:21:46

2 réponses

sur tomcat, ils sont généralement des threads de demande de travail attendant que quelqu'un se connecte. Rien à craindre. Ils sont prêts à gérer les 100 utilisateurs qui se connectent à la fois à votre serveur.

22
répondu ptyx 2011-11-10 21:32:53

ces threads font partie d'un ThreadPool. Plus spécifiquement java.util.simultané.ThreadPoolExecutor. Le fil est en attente d'un Runnable / Callable à soumettre à la piscine. Par exemple,

ExecutorService e = Executors.newFixedThreadPool(10);

va créer 10 threads qui vont attendre

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

alors un thread sera notifié et invoquera ce runnable. Ce qu'ils sont utilisés pour la je ne peux pas dire. Vous devez découvrir ce qui a commencé le pool de fils. Peut-être qu'il traite les demandes des clients le serveur d'application.

6
répondu John Vint 2011-11-10 21:31:51