Maison  >  Article  >  Java  >  Comment un hook d'arrêt en Java peut-il être utilisé pour garantir la fin en douceur d'une application, en particulier lorsqu'il s'agit d'opérations sur des fichiers ?

Comment un hook d'arrêt en Java peut-il être utilisé pour garantir la fin en douceur d'une application, en particulier lorsqu'il s'agit d'opérations sur des fichiers ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 01:10:02219parcourir

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

Exemple pratique d'un hook d'arrêt en Java

En Java, les hooks d'arrêt permettent aux applications d'effectuer des tâches de nettoyage à la fin. Cela peut être utile pour garantir que le programme s'arrête correctement en cas d'interruption inattendue.

Exemple d'utilisation

Considérez l'application suivante qui écrit des nombres dans un fichier par lots :

<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>

Intégrer un hook d'arrêt

Pour intégrer un hook d'arrêt dans cette application, suivez ces étapes :

  1. Ajoutez un indicateur booléen volatile statique, keepRunning, pour indiquer si le l'application doit continuer à fonctionner ou non.
  2. Dans la méthode run(), vérifiez l'indicateur keepRunning dans la boucle pour vous assurer que l'application n'écrit pas plus de lots que nécessaire.
  3. Dans le main() méthode, enregistrez un hook d'arrêt qui définit l'indicateur keepRunning sur false et se joint au thread principal pour attendre qu'il se termine.
<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>

En implémentant un hook d'arrêt, vous pouvez fournir un hook d'arrêt plus résilient. application qui effectue les tâches de nettoyage nécessaires avant de terminer.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn