Java thread s'arrête sans Exception
Lorsque j'utilise 4 fils pour mon programme il n'y a généralement pas de problème, mais aujourd'hui, j'ai augmenté à 8 et j'ai remarqué 1-3 fils d'arrêter de travailler, sans jeter des exceptions. Est-il de toute façon pour savoir pourquoi ils sont à l'arrêt? est-il de toute façon à rendre le fil de redémarrer?
C'est la façon dont la structure de mon fils est
public void run()
{
Main.logger.info(threadName + ": New Thread started (inside run)");
while (true)
{
try
{
//all my code
//all my code
//all my code
}
catch(Exception e)
{
Main.logger.error("Exception: " + e);
try
{
Thread.sleep(10000);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
}
finally
{
try
{
webClient.closeAllWindows();
Thread.sleep(3000);
Main.logger.info(threadName + ": Closed browser!");
}
catch (Exception e)
{
Main.logger.error("Exception: " + e);
}
}
}//end while
}
Ce qui concerne les!
Que voyez-vous dans le débogueur?
Quand vous dites "arrêt de travail" voulez-vous dire que le filetage de mettre fin, ou qu'ils se "coincé" et de rester là pour toujours?
c'est difficile à dire, mais quand j'ai vérifier les journaux le dernier message est dans le bloc finally, rien ne se passe avec ce thread après le bloc finally est exécuté
mettre un message de la console à la fin de la course du fil de mise en œuvre qui dit que "la Paix, je suis outta here" ou quelque chose. Puis une pause sur cette ligne ou tout simplement regarder la console
J'ai beaucoup de messages de log dans mon fil et quand ils ne fin, il va tout d'un coup pour le bloc finally et imprime threadName: fermé le navigateur!
Quand vous dites "arrêt de travail" voulez-vous dire que le filetage de mettre fin, ou qu'ils se "coincé" et de rester là pour toujours?
c'est difficile à dire, mais quand j'ai vérifier les journaux le dernier message est dans le bloc finally, rien ne se passe avec ce thread après le bloc finally est exécuté
mettre un message de la console à la fin de la course du fil de mise en œuvre qui dit que "la Paix, je suis outta here" ou quelque chose. Puis une pause sur cette ligne ou tout simplement regarder la console
J'ai beaucoup de messages de log dans mon fil et quand ils ne fin, il va tout d'un coup pour le bloc finally et imprime threadName: fermé le navigateur!
OriginalL'auteur Arya | 2012-08-13
Vous devez vous connecter pour publier un commentaire.
Noter qu'un
Error
est pas unException
; c'est unLancer
.Donc, si vous
catch Exception
,Errors
sera toujours obtenir par le biais de:à rattraper "tout", modifiez votre code pour cela:
Notez qu'il peut y avoir peu de choses que vous pouvez faire si une Erreur se produit. Extrait de la javadoc de l'Erreur:
Vous attrapez
Throwable
au lieu deException
. Notez bien que, la guérison est probablement pas possible, même les plus simples de la journalisation peut ne pas fonctionner.J'ai ajouté un Throwable bloc et j'ai trouvé le problème, c'est la JVM en cours d'exécution hors de l'espace du tas. Après une augmentation de la que sa fonctionne bien 🙂 merci
Ouais, pas de problème. Il ya tellement de nombreux programmeurs java qui ne se rendent pas compte de ce fait crucial, et comme vous obtenez perplexe quand ils soufflent la mémoire d'un certain type (pile, tas, permgen, peu importe). C'est un de mes préférés des questions d'entrevue pour savoir si "l'expert" avant moi, c'est ce qu'il dit qu'il est 🙂
OriginalL'auteur Bohemian
C'est un peu délicat.
Un fil de Java peut résilier le contrat pour deux raisons:
run()
méthode,Vous pouvez détecter le dernier cas par le biais d'un "UncaughtExceptionHandler" pour le thread, mais le premier cas ne peut pas être détectée, sauf si vous modifiez votre thread
run()
méthode pour enregistrer l'événement ... ou quelque chose comme ça.Je suppose, l'autre façon de comprendre ce qui se passe serait d'attacher un débogueur pour la JVM et rapport de l'exception non interceptée.
(Je soupçonne que la raison pour laquelle vous ne voyez pas toutes les exceptions, c'est que votre fils
run
méthodes ne sont pas attraper /journalisation de toutes les exceptions, ET ils n'ont pas une exception non interceptée.)Pas. Il n'y a pas moyen de redémarrer un Thread qui a été résilié.
1) Vous n'êtes pas attraper les exceptions d'Erreurs. 2) Lire la javadoc de java.lang.Fil de discussion pour les méthodes pour l'établissement d'une exception non interceptée.
OriginalL'auteur Stephen C
Si vous exécutez à partir de la ligne de commande, vous pouvez avoir dump les états de tous les fils de la console. Sur windows vous faites cela en appuyant sur Ctrl+Pause, sous linux, en envoyant le signal de fin dans le processus de "tuer".
Veuillez vous référer à Une Introduction à Java les Traces de Pile
OriginalL'auteur Dmitry B.
Priorité de Thread sur l'un d'eux pourrait être trop élevé, essayez de définir le même niveau?
L'interblocage est possible si il n'y a aucun contrôle sur les uns et les autres entre eux.
OriginalL'auteur nicephotog