1

引用符

定期的に実行する必要がある機能を備えた 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 がスローされた場合、メイン プログラムはまだ実行中です。

4

2 に答える 2

1

シャットダウン フックを使用して、アプリケーションが SIGINT (Control-C) を受け取ったときに正常なシャットダウンを実行できます: を参照してくださいRuntime.addShutdownHook(...)

ただし、これは SIGKILL、JVM のクラッシュ、オペレーティング システムのクラッシュ、およびハード電源障害には対応していません。実際、そのようなシナリオでアプリケーションを完全にシャットダウンする方法はありません。そのためには、堅牢な永続化メカニズムを使用して、定期的に状態を永続化するようにアプリケーションを設計する必要があります。

于 2012-04-25T14:36:02.393 に答える
0

特定のフラグが静的に設定された新しいスレッドを作成します。このスレッドはメイン アプリケーションの開始時に実行され、そこから実行/ロードできます。プログラムの終了アクションで Java イベント リスナーを作成し、その中に新しいスレッドを登録します。プログラムが閉じられるたびに、この新しいスレッドが他のスレッドを開始してアクティブになり、上記の条件のいずれかを実行するためにリソースの最終的な節約を行います。新しいプロセスは、上記のすべての条件 (フラグ) が満たされるまで、これらのスレッドを次々と (それぞれが実行されるたびに) 強制終了します。他のスレッドが残っていない場合、この新しいスレッドはそれ自体を終了し、プログラムは終了します。

于 2012-04-25T14:34:30.057 に答える