BLOCKQUOTE中断された場合にプログラムがデータを失うのを防ぐ方法を教えてください。
私は定期的に実行する必要のある機能を持つJavaプログラムを持っています。しかし、私はラッパープログラムを終了することができます(あなたがUNIXの人なら、ターミナルウィンドウやSIGTERMではCtrl + Cと思っています)、ラッパーが起動するメインプログラムのプロセスやスレッドを中断する危険はありません。
最初は、処理のたびに一定の間隔でメインプログラムをスリープさせるべきだと思っていました。次に、プログラムを終了してユーザーが手動で中断した場合、データの処理中に中断され、出力ファイルが途切れたり破損したりする可能性があると考えました。
私は、メインプログラムを呼び出すラッパープログラム(おそらくJavaでも)を書くことをお勧めします。何かがラッパーを閉じると、正常に終了する準備ができるまで、メインプログラムの生成されたスレッドまたはプログラムインスタンスを開いたままにします。さらに、メインプログラムのたかだか1つのインスタンスがいつでも実行されている必要があります。メインプログラムのインスタンスが実行されている場合は、他のメインプログラムのインスタンスを起動何も しない :
n分ごとに:
は、ここで私は私のラッパーは(擬似コードで)やりたいものです。クローズ時に
: それは
を実行している場合、私は(効果的にコマンドラインから)私のメインプログラムを実行するか、私は私のメインプログラムを変更する必要がありますJavaランタイムオブジェクト/ライブラリを使用すべき完了までのメインプログラムの実行を残しますRunnableを実装し、私のメインプログラムを実行するスレッドを生成するラッパープログラムを持っていますか?
EDIT(可能な解決策?):
現在、私は(http://docs.oracle.com/javase/7/docs/api/java/lang/Process.htmlとhttp://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.htmlを参照)exec関数を使用して、メインプログラムを呼び出すためにJavaランタイムオブジェクトを使用してと思っています。メインプログラムが既に実行されているかどうかを判断するには、Process.exitValue()関数を使用します。 IllegalThreadStateExceptionをスローすると、メインプログラムはまだ実行されています。
1つの解決方法は、control-Cを使用しないことです。すべての_ソフトウェアはJMXボタンで閉じています。これにより、クラスを適切に閉じて、JVMが難しくなったときにクラスを閉じる必要がなくなります。 – Gray
私のプログラムは端末/コンソールから実行されますが、GUIはありません。 – user1258361
問題ではありません。 JMXボタンを簡単に公開し、JMXコマンドラインクライアントを使用してアプリケーションを終了することもできます。 – Gray