Shutdown hook 提供了一種機制來確保 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>
修改>
<code class="java">//... for (int i = 0; i < N && keepRunning; ++i) writeBatch(pw, i); //...</code>
當JVM 收到關閉訊號(例如Ctrl C ),關閉鉤子keepRunning 設定為false。 run() 方法將繼續寫入數據,直到 keepRunning 為 false,確保目前批次在程式退出之前完成。
<code class="java">//... Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { keepRunning = false; mainThread.join(); } }); //...</code>
以上是Java 中的關閉掛鉤如何確保程式正常終止?的詳細內容。更多資訊請關注PHP中文網其他相關文章!