Maison >Java >javaDidacticiel >Comment les hooks d'arrêt peuvent-ils garantir la terminaison progressive du programme en Java ?

Comment les hooks d'arrêt peuvent-ils garantir la terminaison progressive du programme en Java ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-04 13:00:03609parcourir

How Can Shutdown Hooks Ensure Graceful Program Termination in Java?

Utilisation des hooks d'arrêt pour une terminaison gracieuse du programme en Java

Les hooks d'arrêt fournissent un mécanisme permettant de garantir que les applications Java effectuent les tâches de nettoyage nécessaires avant de se fermer correctement. Dans cet article, nous aborderons l'application pratique des hooks d'arrêt, en explorant un scénario dans lequel nous voulons garantir que les données sont vidées dans un fichier avant la fin du programme.

Considérez l'application Java suivante :

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

Dans cette application, nous écrivons des lots de nombres dans un fichier. Pour garantir qu'un lot est terminé avant que le programme ne soit interrompu, nous utiliserons un hook d'arrêt.

Intégrer un hook d'arrêt

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

  1. Enregistrez le hook d'arrêt : Utilisez la méthode Runtime.getRuntime().addShutdownHook() pour enregistrer le hook d'arrêt auprès de la JVM.
  2. Implémentez le hook d'arrêt hook : Définissez un thread (sous-classe de Thread) qui définit les actions à effectuer lorsque le hook est invoqué.
  3. Dans le hook d'arrêt : Définissez un indicateur ou une variable atomique sur false pour signaler au thread principal d'arrêter d'écrire dans le fichier.
  4. Dans le thread principal : Vérifiez l'indicateur ou la variable atomique à l'intérieur de la boucle d'écriture. Lorsqu'il devient faux, arrêtez d'écrire et terminez toutes les opérations en attente.
  5. Rejoignez les fils de discussion : Une fois l'écriture terminée, rejoignez le fil de discussion principal (ou tout autre fil de discussion de travail) pour vous assurer que tous les fils de discussion ont terminé l'exécution.

Voici un exemple :

Ajoutez une variable keepRunning :

<code class="java">final static volatile boolean keepRunning = true;</code>

Modifiez la fonction run() method :

<code class="java">//...
for (int i = 0; i < N && keepRunning; ++i)
    writeBatch(pw, i);
//...</code>

Ajouter le hook d'arrêt dans main() :

<code class="java">//...
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        keepRunning = false;
        mainThread.join();
    }
});
//...</code>

Lorsque la JVM reçoit un signal d'arrêt (par exemple, Ctrl C ), le hook d'arrêt définira keepRunning sur false. La méthode run() continuera ensuite à écrire des données jusqu'à ce que keepRunning soit faux, garantissant ainsi que le lot en cours est terminé avant la fermeture du programme.

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