La consommation du PROCESSEUR lorsque le thread est en veille à l'aide de Fil.le sommeil
J'ai un programme serveur qui les sondages d'une base de données pour les nouvelles demandes , je veux que cette interrogation être fait à intervalles de 1 minute, donc , j'ai créé un Thread.sleep() dans le programme de la boucle while.
Le problème est qu'à chaque fois que ce programme est censé "le sommeil" la consommation CPU monte de façon drastique (viz. environ 25 - 30%).
Paradoxalement, lorsque le programme n'est pas inactive et qu'il est occupé à traiter les demandes , la CPU, la consommation tombe à 0,4%.
J'ai lu en ligne et a trouvé qu'il y avait de performances associés avec fil.le sommeil, mais je ne pouvais trouver aucune solution de rechange viable (Thread.attendre exige la notification sur un objet, quelque chose qui me semble inutile dans mon scénario)
La boucle principale (quand il n'y a pas de nouvelles demandes) ne pas faire n'importe quoi, voici un squelette de tout ce qui est fait lors de la consommation CPU est de 25%
-> sondage
-> Pas de nouveaux records ?
-> le Sommeil
->répéter
while
boucle en train de faire?C'est bizarre. Pouvez-vous réduire à un petit programme qui se comporte comme vous le décrivez, et de le poster ici? À tout le moins, merci de nous montrer le squelette de votre
sleep
boucle (à l'aide de code).Veuillez fournir le code de la section où vous ne le réel de couchage.
Juste pour s'assurer - vous ne l'utilisez pas
Thread.sleep(60)
dormir pendant 60 secondes, non? (qui serait la cause d'un sommeil de 60 millisecondes)OriginalL'auteur angryInsomniac | 2011-10-14
Vous devez vous connecter pour publier un commentaire.
Vérifier que la consommation CPU est pour l'individu de cœurs. Si vous utilisez un 4 core de la machine, peut-être qu'un thread est going rogue et est en train de manger une fois de coeur (25%). Cela se produit généralement lorsque le thread est dans une boucle serrée.
Vous pouvez utiliser
Thread.wait
avec un délai d'attente (qui est en effet leTimer
classe), mais mon pari est qu'il ne fera aucune différence. Les deuxThread.sleep
etThread.wait
changements les fils de l'état denot runnable
. Bien que cela dépend de votre JVM etc., le fil ne doit pas consommer beaucoup de CPU dans une telle situation. Donc, mon pari est qu'il y a quelque bug au travail.Une autre chose que vous pouvez faire est de prendre un thread dump et voir ce que le fil est en train de faire quand cela arrive. Utilisation
kill -3
sur une machine Linux, ou utilisez ctrl+pause sur la fenêtre de la console java si vous utilisez Windows. Ensuite, examinez le thread dump qui est exportée vers la sortie standard. Ensuite, vous pouvez être sûr que si le thread a été fait de dormir ou de faire quelque chose d'autre.OriginalL'auteur Enno Shioji
Que de nombreuses personnes ont souligné, Fil.le sommeil devrait et ne fait aider par l'abandon de l'utilisation du PROCESSEUR de façon drastique.
J'ai omis certains faits de ma question initiale que je pensais qu'ils n'étaient pas pertinentes.
Le thread principal était le producteur, il y avait un autre thread qui exécute de façon asynchrone qui a été le consommateur. Il s'avère que le "sommeil" sur ce fil était à l'intérieur de certaines bizarre, condition qui n'était pas déclenché correctement. Donc la boucle sur ce thread n'a jamais été de couchage.
Une fois que le sommeil chose a été éliminé, je suis allé de l'avant et à l'analyser de près pour réaliser le problème.
OriginalL'auteur angryInsomniac