Note that there are some explanatory texts on larger screens.

plurals
  1. POWhat keeps java processes alive after jar execution?
    primarykey
    data
    text
    <p>I have a java jar file which I am executing from the windows command prompt. The code finishes normally (i.e. does what it is supposed to) but the java process continues to run. The application is single threaded. I need to hit Ctrl-c to stop the process after the code completes to get the command prompt back. </p> <p>I assume that I could put a <code>System.exit(0)</code> at the end of my main method which would presumably fix this, but I was under the impression that it wasn't necessary. Under what conditions are java processes kept alive at the end of execution? Here's the shell of my main method:</p> <pre><code>public static void main(String[] args) { try { //application code here Logger.log("Now finished"); } catch (SomeExceptoin e) { Logger.error("Some error occured"); } } </code></pre> <p>Where the logger is my own incredibly basic static class which just dumps messages to <code>System.out.println()</code>. "Now finished" appears in the console, but the process continues to run. Any ideas? </p> <p>EDIT: As requested, here's the logger code in all its glory (I did warn you :)</p> <pre><code>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; } } </code></pre> <p>EDIT EDIT: I put a finally block onto my try above with the thread dump code from the link in instanceofTom's answer. Here's the output:</p> <p>... [2010.11.18 11:22:57] Output complete. All processing now finished. </p> <hr> <p>Thread name: Reference Handler java.lang.Object.wait(Native Method) java.lang.Object.wait(Object.java:485) java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) </p> <hr> <p>Thread name: Finalizer java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) </p> <hr> <p>Thread name: Signal Dispatcher </p> <hr> <p>Thread name: Attach Listener </p> <hr> <p>Thread name: Java2D Disposer 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) </p> <hr> <p>Thread name: main 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(Native Method) 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) </p> <hr> <p>Thread name: com.google.inject.internal.Finalizer java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) com.google.inject.internal.Finalizer.run(Finalizer.java:114) </p> <hr> <p>Thread name: AWT-Windows sun.awt.windows.WToolkit.eventLoop(Native Method) sun.awt.windows.WToolkit.run(WToolkit.java:291) java.lang.Thread.run(Thread.java:619) </p> <hr> <p>Thread name: 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) <strong><em>*</em>**<em>*</em>**<em>*</em>**<em>*</em>**<em>*</em>**<em>*</em></strong> Thread name: Reference Handler java.lang.Object.wait(Native Method) java.lang.Object.wait(Object.java:485) java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) </p> <hr> <p>Thread name: Finalizer java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) </p> <hr> <p>Thread name: Signal Dispatcher </p> <hr> <p>Thread name: Attach Listener </p> <hr> <p>Thread name: Java2D Disposer 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) </p> <hr> <p>Thread name: main 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(Native Method) 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) </p> <hr> <p>Thread name: com.google.inject.internal.Finalizer java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) com.google.inject.internal.Finalizer.run(Finalizer.java:114) </p> <hr> <p>Thread name: AWT-Windows sun.awt.windows.WToolkit.eventLoop(Native Method) sun.awt.windows.WToolkit.run(WToolkit.java:291) java.lang.Thread.run(Thread.java:619) </p> <hr> <p>Thread name: 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) </p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload