ホームページ  >  記事  >  Java  >  特にファイル操作を扱う場合、Java のシャットダウン フックを使用してアプリケーションを正常に終了するにはどうすればよいでしょうか?

特にファイル操作を扱う場合、Java のシャットダウン フックを使用してアプリケーションを正常に終了するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-06 01:10:02219ブラウズ

How can a shutdown hook in Java be used to ensure graceful termination of an application, especially when dealing with file operations?

Java でのシャットダウン フックの実用的な例

Java では、シャットダウン フックは、アプリケーションが終了時にクリーンアップ タスクを実行する方法を提供します。これは、予期しない中断が発生した場合にプログラムを確実に正常にシャットダウンするのに役立ちます。

使用例

バッチでファイルに数値を書き込む次のアプリケーションについて考えてみましょう。

<code class="java">import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class GracefulShutdownTest1 {
    private final File f;
    private final int N;

    public GracefulShutdownTest1(File f, int N) {
        this.f = f;
        this.N = N;
    }

    public void run() {
        try (PrintWriter pw = new PrintWriter(new FileOutputStream(f))) {
            for (int i = 0; i < N; ++i) {
                writeBatch(pw, i);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    private void writeBatch(PrintWriter pw, int i) {
        for (int j = 0; j < 100; ++j) {
            pw.write(Integer.toString(i * 100 + j));
            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>

シャットダウン フックの統合

このアプリケーションにシャットダウン フックを統合するには、次の手順に従います。

  1. 静的揮発性ブール フラグ keepRunning を追加して、アプリケーションは実行を継続する必要があります。
  2. run() メソッドで、ループ内の keepRunning フラグをチェックして、アプリケーションが必要以上のバッチを書き込まないようにします。
  3. main()メソッドで、keepRunning フラグを false に設定し、メイン スレッドに参加して終了を待つシャットダウン フックを登録します。
<code class="java">private static volatile boolean keepRunning = true;

// ...

public void run() {
    try (PrintWriter pw = new PrintWriter(new FileOutputStream(f))) {
        for (int i = 0; i < N && keepRunning; ++i) {
            writeBatch(pw, i);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

// ...

public static void main(String[] args) {
    final Thread mainThread = Thread.currentThread();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            keepRunning = false;
            mainThread.join();
        }
    });

    new GracefulShutdownTest1(new File(args[0]), Integer.parseInt(args[1])).run();
}</code>

シャットダウン フックを実装することで、より復元力の高い終了する前に必要なクリーンアップ タスクを実行するアプリケーション。

以上が特にファイル操作を扱う場合、Java のシャットダウン フックを使用してアプリケーションを正常に終了するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。