J'ai un fichier java jar que j'exécute depuis l'invite de commande Windows. Le code se termine normalement (c'est-à-dire fait ce qu'il est censé faire) mais le processus Java continue de s'exécuter. L'application est à un seul thread. Je dois appuyer sur Ctrl-c pour arrêter le processus une fois le code terminé pour récupérer l'invite de commande.Qu'est-ce qui maintient les processus java en vie après l'exécution du jar?
Je suppose que je pourrais mettre un System.exit(0)
à la fin de ma méthode principale qui serait probablement résoudre ce problème, mais j'avais l'impression que ce n'était pas nécessaire. Dans quelles conditions les processus java sont-ils maintenus en vie à la fin de l'exécution? Voici la coquille de ma méthode principale:
public static void main(String[] args) {
try {
//application code here
Logger.log("Now finished");
} catch (SomeExceptoin e) {
Logger.error("Some error occured");
}
}
Lorsque l'enregistreur est ma propre classe statique incroyablement basique qui dépotoirs juste des messages à System.out.println()
. "Now finished" apparaît dans la console, mais le processus continue à s'exécuter. Des idées?
EDIT: Comme demandé, voici le code de l'enregistreur dans toute sa gloire (je ne vous préviens :)
public class Logger {
public static void logInfo(String logMessage)
{
System.out.println(timestamp() + logMessage);
}
private static String timestamp()
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss");
String timestamp = "[" + formatter.format(new Date()) + "] ";
return timestamp;
}
}
EDIT EDIT: Je mets un bloc finally sur mon essai ci-dessus avec le code de vidage de fil de la lien dans la réponse de instanceofTom. Voici la sortie:
... [2010.11.18 11:22:57] Sortie terminée. Tout le traitement est maintenant terminé.
Nom du thread: Référence gestionnaire java.lang.Object.wait (Native Method) java.lang.Object.wait (Object.java:485) java.lang.ref.Reference $ ReferenceHandler. run (Reference.java:116)
nom du fil: Finalizer java.lang.Object.wait (native Method) java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:116) java .lang.ref.ReferenceQueue.remove (RéférenceQueue.java:132) java.lang.ref.Finalizer $ FinalizerThread.run (Finalizer.java:159)
Nom du fil: Signal Dispatcher
Nom du thread: Joindre Listener
Nom du fil: Java2D Disposer java.lang.Object.wait (Méthode native) java.lang.ref.ReferenceQueue.remove (RéférenceQueue.java:116) java. lang.ref.ReferenceQueue.remove (ReferenceQueue.java:132) sun.java2d.Disposer.run (Disposer.java:125) java.lang.Thread.run (Thread.java:619)
Nom du fil: principal java.lang.Thread.getStackTrace (Thread.java:1436) com.my.code.WorkloadManager.visit (WorkloadManager.java:124) com.my.code.WorkloadManager.visit (WorkloadManager. java: 138) com.my.code.WorkloadManager.main (WorkloadManager.java:71) sun.reflect.NativeMethodAccessorImpl.invoke0 (méthode native) sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke (Method.java:597) org.eclipse.jdt.internal .jarinjarloader.JarRsrcLoader.main (JarRsrcLoader.java:56)
nom du fil: com.google.inject.internal.Finalizer java.lang.Object.wait (native Method) java.lang.ref .ReferenceQueue.remove (RéférenceQueue.java:116) java.lang.ref.ReferenceQueue.remove (RéférenceQueue.java:132) com.google.inject.internal.Finalizer.run (Finalizer.java:114)
Nom du thread: AWT Windows sun.awt.windows.WToolkit.eventLoop (Native Method) sun.awt.windows.WToolkit.run (WToolkit.java:291) java.lang.Thread .run (Thread.java:619)
nom Sujet: EventQueueMonitor-ComponentEvtDispatch java.lang.Object.wait (native Method) java.lang.Object.wait (Object.java:485) com.sun.java.accessibility.util.ComponentEvtDispatchThread.run (EventQueueMonitor.java:616) * ** * ** * ** * ** * ** * Nom du thread: Référence gestionnaire java.lang.Object.wait (Native Method) java .lang.Object.wait (Object.java:485) java.lang.ref.Reference $ ReferenceHandler.run (Reference.java:116)
nom du fil: Finalizer java.lang.Object.wait (méthode native) java.lang.ref.ReferenceQueue.remove (RéférenceQueue.java:116) java.lang.ref.ReferenceQueue.remove (RéférenceQueue.java:132) java.lang. ref.Finalizer $ FinalizerThread.run (Finalizer.java:159)
nom du fil: signal Dispatcher
nom du thread: Attacher Listener
Nom du fil: Java2D éliminateur java.lang.Object.wait (Native Method) java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:116) java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java: 132) sun.java2d.Disposer.run (Disposer.java:125) java.lang.Thread.run (Thread.java:619)
nom du fil: principal java.lang.Thread. getStackTrace (Thread.java:1436) com.my.code.WorkloadManager.visit (WorkloadManager.java:124) com.my.code.WorkloadManager.visit (WorkloadManager.java:138) com.my.code.WorkloadManager.main (WorkloadManager.java:71) sun.reflect.NativeMethodAccessorImpl.invoke0 (Méthode natif) sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java: 25) java.lang.reflect.Method.invoke (Method.java:597) org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main (JarRsrcLoader.java:56)
nom du fil: com.google.inject.internal.Finalizer java.lang.Object.wait (Méthode native) java.lang.ref.ReferenceQueue.remove (RéférenceQueue.java:116) java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:132) com.google.inject.internal.Finalizer.run (Finalizer.java:114)
Nom Sujet: AWT Windows sun.awt.windows.WToolkit.eventLoop (Méthode natif) sun.awt.windows.WToolkit.run (WToolkit.java:291) java.lang.Thread.run (Thread.java:619)
Nom de fil: EventQueueMonitor-ComponentEvtDispatch java.lang.Object.wait (Méthode native) java.lang.Object.wait (Object.java:485) com.sun.java.accessibility.util.ComponentEvtDispatchThread.run (EventQueueMonitor.java:616)
Le programme Java appelle-t-il Runtime.exec() du tout? – izb
Je publierais peut-être aussi le code de l'enregistreur. D'une manière ou d'une autre, un thread orphelin doit persister. Je ne connais pas d'autre moyen pour que cela se produise. – aepryus
Une cause fréquente est d'autres threads non-démon. Bien que votre code soit monothread, êtes-vous certain qu'aucune des choses que vous appelez n'est en train de créer des threads non-démon? –