我有一個java的jar文件,我正在執行從Windows命令提示符。代碼正常完成(即做它應該做的),但java進程繼續運行。該應用程序是單線程的。我需要在代碼完成後按Ctrl-c來停止進程,以便返回命令提示符。在jar執行後,java進程保持活動狀態嗎?
我認爲我可以把System.exit(0)
放在我的主要方法的末尾,這可能會解決這個問題,但我的印象是沒有必要。 java進程在執行結束時保持活動的條件是什麼?這是我的主要方法的外殼:
public static void main(String[] args) {
try {
//application code here
Logger.log("Now finished");
} catch (SomeExceptoin e) {
Logger.error("Some error occured");
}
}
當記錄儀是剛剛轉儲消息System.out.println()
我自己的令人難以置信的基本靜態類。 「現在完成」出現在控制檯中,但該過程繼續運行。有任何想法嗎?
編輯:按照要求,這裏是在其所有的榮耀的記錄代碼(我沒提醒你:)
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;
}
}
編輯編輯:我把finally塊到我嘗試了上述從線程轉儲代碼鏈接在instanceofTom的答案中。這裏輸出:
... [2010.11.18 11:22:57]輸出完成。所有處理現在完成。
線程名稱:指向處理器 java.lang.Object.wait(本機方法) java.lang.Object.wait(Object.java:485) java.lang.ref.Reference中的$ ReferenceHandler。運行(Reference.java:116)
線程名稱:終結 java.lang.Object.wait(本機方法) 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)
線程名稱:信號調度
主題名稱:將監聽
線程名稱: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)
線程名: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)
線程名稱:com.google.inject.internal.Finalizer java.lang.Object.wait(本機方法) 的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)
主題名稱:AWT窗口 sun.awt.windows.WToolkit.eventLoop(本機方法) sun.awt.windows.WToolkit.run(WToolkit.java:291) 的java.lang.Thread .RUN(Thread.java:619)
主題名稱:EventQueueMonitor-ComponentEvtDispatch java.lang.Object.wait(本機方法) java.lang.Object.wait(Object.java:485) com.sun.java.accessibility.util.ComponentEvtDispatchThread.run(EventQueueMonitor.java:616)* ** * ** * ** * ** * ** * 線程名稱:指向處理器 java.lang.Object.wait(本機方法) 的java .lang.Object.wait(Object.java:485) java.lang.ref.Reference中的$ ReferenceHandler.run(Reference.java:116)
線程名稱:終結 java.lang.Object.wait(本地方法) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) java.lang.Object ref.Finalizer $ FinalizerThread.run(Finalizer.java:159)
線程名稱:信號調度
主題名稱:將監聽
線程名: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)
線程名稱:主要 的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(本機方法) 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)
主題名稱: 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)
主題名稱:AWT窗口 sun.awt.windows.WToolkit.eventLoop(本機方法) sun.awt.windows.WToolkit.run(WToolkit.java:291) java.lang.Thread.run(Thread.java:619)
線程名: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)
java程序是否調用Runtime.exec()? – izb 2010-11-18 22:25:32
我也許會發布記錄器代碼。不知何故,一個孤兒的線程必須堅持。我知道沒有其他辦法會發生這種情況。 – aepryus 2010-11-18 22:25:58
一個常見的原因是附加的非守護線程。雖然你的代碼是單線程的,但你是否肯定你所調用的內容都不是創建非守護線程? – 2010-11-18 22:30:05