Maison >Java >javaDidacticiel >Comment les hooks d'arrêt peuvent-ils garantir la terminaison progressive 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.
Pour intégrer un hook d'arrêt, suivez ces étapes :
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!