私はWindowsのコマンドプロンプトから実行しているjava jarファイルを持っています。コードは正常に終了する(すなわち、それが想定される)が、Javaプロセスは引き続き実行されます。アプリケーションはシングルスレッドです。コマンドプロンプトを返すためにコードが完了した後にプロセスを停止するには、Ctrl-cを押す必要があります。jar実行後にJavaプロセスを生き残らせるには?
System.exit(0)
を私の主な方法の最後に置くことができたと思われますが、これはおそらくこれを修正するでしょうが、私はそれが必要ではないという印象を受けました。 Javaプロセスは実行の最後にどのような条件下で生き残ったのですか?ロガーはちょうどSystem.out.println()
にメッセージをダンプし、私自身、信じられないほどの基本的な静的なクラスがある
public static void main(String[] args) {
try {
//application code here
Logger.log("Now finished");
} catch (SomeExceptoin e) {
Logger.error("Some error occured");
}
}
:ここに私のメインメソッドのシェルです。 「完了しました」がコンソールに表示されますが、プロセスは引き続き実行されます。何か案は?
EDIT:要求されたとして、ここロガーコードはそのすべての栄光であります(私はあなたに警告しなかった:)
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;
}
}
編集編集:私は最終的にからのスレッドダンプコードで上記の私の挑戦にブロック置きます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ディスポーザー java.lang.Object.wait(ネイティブメソッド) 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(ネイティブメソッド) 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-Windowsの 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。 ref.Finalizer $ FinalizerThread.run(Finalizer.java:159)
スレッド名:信号ディスパッチャ
スレッド名:アタッチリスナー
スレッド名:Java2Dディスポーザー java.lang.Object.wait(ネイティブメソッド) 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(ネイティブメソッド) 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-Windowsの 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プログラムはRuntime.exec()をまったく呼び出しますか? – izb
私はおそらくロガーコードも掲示します。何とか孤立したスレッドが永続している必要があります。私はこれが起こる他の方法がないことを知っています。 – aepryus
頻繁な原因は、デーモンではない追加のスレッドです。あなたのコードはシングルスレッドではありますが、あなたが呼んでいるもののどれも非デーモンスレッドを作成しているとは思わないでしょうか? –