引用符
定期的に実行する必要がある機能を備えた Java プログラムがあります。ただし、ラッパーが開始するメインプログラムプロセスまたはスレッドを中断するリスクなしに、ラッパープログラムを閉じることができるようにしたいと思います (UNIX の場合は、ターミナルウィンドウで Ctrl+C を押すか、SIGTERM を考えてください)。
最初は、各ラウンドの処理の後、メイン プログラムを一定時間スリープさせるべきだと考えていました。次に、プログラムを閉じる必要があり、ユーザーが手動で中断した場合、データの処理中に中断され、出力ファイルが切り刻まれたり破損したりする可能性があると考えました。
メインプログラムを呼び出すラッパープログラム(おそらくJavaでも)を作成するのが最善の方法だと思います。何かがラッパーを閉じた場合、生成されたスレッドまたはメイン プログラムのプログラム インスタンスを、適切に閉じる準備ができるまで開いたままにしておきたいと思います。さらに、メイン プログラムのインスタンスは常に 1 つだけ実行する必要があります。
ラッパーに実行させたいことは次のとおりです(疑似コードで):
n 分ごと: メイン プログラムのインスタンスが実行されている場合は、メイン プログラムのインスタンスを生成する以外に何もしません。
終了時: メイン プログラムが実行中の場合は、完了するまで実行したままにします。
Java ランタイム オブジェクト/ライブラリを使用してメイン プログラムを (コマンド ラインから効果的に) 実行する必要がありますか、それともメイン プログラムを変更して Runnable を実装し、ラッパー プログラムでメイン プログラムを実行するスレッドを生成する必要がありますか?
編集(可能な解決策?):
現在、Java ランタイム オブジェクトを使用して、exec 関数を使用してメイン プログラムを呼び出すことを考えています ( http://docs.oracle.com/javase/7/docs/api/java/lang/Process.htmlおよびhttp: //docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html )。メイン プログラムが既に実行されているかどうかを判断するには、Process.exitValue() 関数を使用します。IllegalThreadStateException がスローされた場合、メイン プログラムはまだ実行中です。