Rumah  >  Artikel  >  Java  >  Bagaimanakah cangkuk penutupan dalam Java boleh digunakan untuk memastikan penamatan aplikasi yang anggun, terutamanya apabila berurusan dengan operasi fail?

Bagaimanakah cangkuk penutupan dalam Java boleh digunakan untuk memastikan penamatan aplikasi yang anggun, terutamanya apabila berurusan dengan operasi fail?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-06 01:10:02219semak imbas

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

Contoh Praktikal Shutdown Hook dalam Java

Di Java, shutdown hook menyediakan cara untuk aplikasi melaksanakan tugas pembersihan selepas penamatan. Ini boleh berguna untuk memastikan atur cara dimatikan dengan anggun sekiranya berlaku gangguan yang tidak dijangka.

Contoh Penggunaan

Pertimbangkan aplikasi berikut yang menulis nombor pada fail dalam kelompok:

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

Menyepadukan Cangkuk Penutupan

Untuk menyepadukan cangkuk penutupan ke dalam aplikasi ini, ikut langkah berikut:

  1. Tambahkan bendera boolean yang tidak menentu statik, keepRunning, untuk menunjukkan sama ada aplikasi harus terus berjalan atau tidak.
  2. Dalam kaedah run(), semak bendera keepRunning dalam gelung untuk memastikan aplikasi tidak menulis lebih banyak kelompok daripada yang diperlukan.
  3. Dalam main() kaedah, daftarkan cangkuk penutupan yang menetapkan bendera keepRunning kepada palsu dan bercantum dengan utas utama untuk menunggu sehingga selesai.
<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>

Dengan melaksanakan cangkuk penutupan, anda boleh menyediakan cangkuk yang lebih berdaya tahan aplikasi yang melaksanakan tugas pembersihan yang diperlukan sebelum ditamatkan.

Atas ialah kandungan terperinci Bagaimanakah cangkuk penutupan dalam Java boleh digunakan untuk memastikan penamatan aplikasi yang anggun, terutamanya apabila berurusan dengan operasi fail?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn