Fil de discussion.sleep() est bloquée?
Voici mon code simple à boucle à chaque seconde (n'a pas besoin d'être exact) et le coup d'envoi d'un travail si nécessaire:
while (true) {
//check db for new jobs and
//kick off thread if necessary
try {
Thread.sleep(1000);
} catch(Throwable t) {
LOG.error("", t);
}
}
Ce code a bien fonctionné pendant plusieurs mois. Juste hier, nous avons commencé à avoir des problèmes où l'un de nos serveurs semble être suspendu dans le Fil.sleep(1000) méthode. OIE - cela fait plus d'un jour et le Fil.le sommeil n'a pas renvoyé. J'ai commencé jconsole et obtenir cette info sur le fil.
Name: Thread-3
State: TIMED_WAITING
Total blocked: 2 Total waited: 2,820
Stack trace:
java.lang.Thread.sleep(Native Method)
xc.mst.scheduling.Scheduler.run(Scheduler.java:400)
java.lang.Thread.run(Thread.java:662)
Planificateur.java:400 est le Fil.le sommeil de la ligne ci-dessus. La jconsole de sortie n'a pas incrémenter "Total attendu" chaque seconde que je m'attends. En fait elle ne change pas du tout. J'ai même arrêté jconsole et a commencé à remettre en place dans l'espoir que peut-être ce serait forcer un rafraîchissement, mais seulement obtenu le même nombre de nouveau. Je ne sais pas ce qu'il y a une autre explication pourrait être d'ailleurs que la jvm a mal accroché sur la commande de mise en veille. Au cours de mes années, cependant, j'ai eu si peu de problèmes avec la jvm que je suppose que ça doit être un oubli de ma part.
remarque: L'autre chose à noter est qu'aucun autre thread est actif. OIE - le cpu est presque inactif. J'ai lu quelque part que le Thread.le sommeil pourrait être légitimement de faim si un autre thread a été actif, mais qui n'est pas le cas ici.
la version solaris:
$ uname -a
SunOS xcmst 5.10 Generic_141415-08 i86pc i386 i86pc
version de java:
$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Server VM (build 20.1-b02, mixed mode)
- Vos journaux de montrer quoi que ce soit venant de la
LOG.error
déclaration? - Pourrait-il être un blocage dans le code de base de données?
- non, rien dans les logs
- Je ne le pense pas. Même s'il existait, serait-ce une raison de ce Thread.le sommeil ne se réveille pas dans ce fil?
- J'ai eu si peu de problèmes avec la jvm que je suppose que ça doit être un oubli de ma part. considérez-vous chanceux 🙂
- Pourquoi êtes-vous attraper
Throwable
dans ce bloc try? Est-il plus logique à l'intérieur du bloc try que vous n'êtes pas à nous montrer? - avez-vous/pouvez-vous envisager de faire tourner dtrace ou strace pour comprendre ce qui conduit à les congeler? Puisque vous avez l'air de l'avoir isolé sur un seul serveur, il peut vous aider à identifier le point de défaillance sur le matériel ou le logiciel de configuration.
- Est l'exécution de votre application dans un environnement virtuel? Je recommanderais d'essayer sans VM.
- Je suis confronté problème similaire, mais maintenant, avec SchecduledThreadPoolExecutor sur la JVM 64 bits sur 64 bits, serveur Linux.
stackoverflow.com/questions/9044423/...
Vous devez vous connecter pour publier un commentaire.
En plus de ce bdonlan dit que vous aimeriez peut-être ScheduledThreadPoolExecutor. Je travail sur un même type de projet et que cet objet a rendu ma vie plus facile, grâce à ce petit extrait.
ScheduleAtFixedRate
J'espère que cela aide!
Êtes-vous selon sur le système de comptage de cycles d'augmenter de façon monotone?
De ce que j'ai entendu de quelqu'un de connu, il (parfois) il arrive que le système de la tique va vers l'arrière par un ou deux graduations. Je n'ai pas vécu moi-même encore, mais si vous êtes en fonction sur ce, cela peut-il expliquer ce qui se passe?
Edit:
Quand j'ai dit
System.currentTimeMillis()
, je crois que je me suis trompé. Je pensais queSystem.currentTimeMillis()
est similaire à WindowsGetTickCount()
fonction (c'est-à-mesures d'un temps qui n'est indépendant de l'heure du système), mais en fait, ce qui ne semble pas être le cas. Afin de cours il peut changer, mais c'était pas mon point: apparemment, les tiques compte mesuré par l'horloge du système peut aussi revenir en arrière par une tique ou deux, même en ignorant le système de changement d'heure. Pas sûr si cela aide, mais grâce à Raedwald pour désigner le système de changement d'heure possibilité, puisque ce n'est pas ce que je voulais dire.GetTickCount
.date
de commande vous pouvez régler l'horloge à l'envers par une quantité arbitraire. Peut-être quelqu'un l'a changé l'horloge pendant que votre processus est en cours d'exécution?Je sais que vous avez regardé dans la jconsole, mais il pourrait être utile d'envoyer le signal 3 pour le processus (c'est, tuer -3) et après plus de la thread dump ici. Ou, si vous voulez vraiment entrer dans les détails, alors vous pourriez envisager de prendre un ou plusieurs pstack/jstack de vidages des processus bloqué en succession rapide, afin de montrer où les fils sont vraiment. L'Information est disponible en ligne sur la façon de corréler cette information avec un java thread dump.
Aussi, par l'un de nos serveurs," vous voulez dire que le problème est reproductible sur un serveur, mais il ne se produit jamais sur d'autres serveurs? Cela indique un problème avec un serveur. Vérifiez que tout est la même à travers vos serveurs et qu'il n'y a pas de questions sur ce matériel en particulier.
Enfin, ce ne serait pas une java problème en soi. Fil de discussion.sleep(long) est une méthode native (cartes directement sur le système d'exploitation de la gestion des threads), afin de vérifier que votre système d'exploitation est à jour.
Avez-vous envisagé d'utiliser Minuterie & TimerTask.
Ici est extrait de simple qui peut vous aider.
MODIFIER
D'après les discussions que j'ai étudiés,
Thread.sleep() is the sign of poorly designed code.
Raisons sontLequel est le mieux, au lieu de Fil.sleep()? Ce qui soulève une autre question. Je vous suggère de jeter un oeil à Simultanéité chapitre du livre
Effective Java
.Thread.sleep() n'est pas une bonne pratique de programmation Java. Juste Google "Est Thread.sleep() mauvais?" et vous verrez que mon point de vue.
Tout d'abord, il rend le Thread courant inaccessibles par d'autres parties du programme, surtout si il est multi-thread. Peut-être que c'est pourquoi vous rencontrez le coup.
Deuxièmement, il serait catastrophique si le thread courant est (HAE) (Event Dispatch Thread) et l'application a Swing GUI.
Une meilleure alternative serait de de l'Objet.wait() :
peut-être vous pouvez essayer un autre outil autre que Jconsole de confirmer qu'il est bloquer dans le sommeil de l'api.
Par exemple, essayer manuellement à l'aide de jstack pour imprimer dans un fichier pour plusieurs fois et vérifiez le résultat.
Ou utiliser un meilleur outil, comme Youkit (commercail) si votre organisation possède sa licence pour le profil de la demande en profondeur, ou de débogage à distance (peut-être ne peut pas en production)
OU Vous pouvez vérifier si le "//check db pour des emplois nouveaux " le code est exécuté pendant. par la vérification de mémorisations, ou de profil, ou de toute autre méthode dépend de votre application........ Si la case db est très rapide, et puis dormir 1 secondes, si est très probable que vous voyez toujours dormir dans la trace de la pile, simplement parce que le rapport de probabilité....