シャットダウン フックは、Java アプリケーションが正常に終了する前に必要なクリーンアップ タスクを確実に実行するメカニズムを提供します。この記事では、シャットダウン フックの実際のアプリケーションを詳しく掘り下げ、プログラムが終了する前にデータがファイルに確実にフラッシュされるようにするシナリオを検討します。
次の Java アプリケーションについて考えてみましょう:
<code class="java">package com.example.test.concurrency; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter; public class GracefulShutdownTest1 { final private int N; final private File f; public GracefulShutdownTest1(File f, int N) { this.f=f; this.N = N; } public void run() { PrintWriter pw = null; try { FileOutputStream fos = new FileOutputStream(this.f); pw = new PrintWriter(fos); for (int i = 0; i < N; ++i) writeBatch(pw, i); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { pw.close(); } } // Write a batch of numbers to the file private void writeBatch(PrintWriter pw, int i) { for (int j = 0; j < 100; ++j) { int k = i*100+j; pw.write(Integer.toString(k)); if ((j+1)%10 == 0) pw.write('\n'); else pw.write(' '); } } public static void main(String[] args) { if (args.length < 2) { System.out.println("args = [file] [N] " +"where file = output filename, N=batch count"); } else { new GracefulShutdownTest1( new File(args[0]), Integer.parseInt(args[1]) ).run(); } } }</code>
このアプリケーションでは、数値のバッチをファイルに書き込みます。プログラムが中断される前にバッチが確実に終了するように、シャットダウン フックを使用します。
シャットダウン フックを統合するには、次の手順に従います。
例を示します:
keepRunning 変数を追加します:
<code class="java">final static volatile boolean keepRunning = true;</code>
run() を変更します。 Method:
<code class="java">//... for (int i = 0; i < N && keepRunning; ++i) writeBatch(pw, i); //...</code>
main() にシャットダウン フックを追加します:
<code class="java">//... Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { keepRunning = false; mainThread.join(); } }); //...</code>
JVM がシャットダウン シグナルを受信したとき (例: Ctrl C )、シャットダウン フックは keepRunning を false に設定します。 run() メソッドは、keepRunning が false になるまでデータの書き込みを継続し、プログラムが終了する前に現在のバッチが確実に終了するようにします。
以上がJava でシャットダウン フックを使用してプログラムを正常に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。