>Java >java지도 시간 >종료 후크는 어떻게 Java에서 프로그램의 정상적인 종료를 보장할 수 있습니까?

종료 후크는 어떻게 Java에서 프로그램의 정상적인 종료를 보장할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-04 13:00:03629검색

How Can Shutdown Hooks Ensure Graceful Program Termination in Java?

Java에서 프로그램을 정상적으로 종료하기 위해 종료 후크 활용

종료 후크는 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>

이 애플리케이션에서는 일련의 숫자를 파일에 씁니다. 프로그램이 중단되기 전에 배치가 완료되도록 하기 위해 종료 후크를 사용합니다.

종료 후크 통합

종료 후크를 통합하려면 다음 단계를 따르세요.

  1. 종료 후크 등록: Runtime.getRuntime().addShutdownHook() 메서드를 사용하여 JVM에 종료 후크를 등록합니다.
  2. 종료를 구현합니다. 후크: 후크가 호출될 때 수행할 작업을 정의하는 스레드(스레드 하위 클래스)를 정의합니다.
  3. 종료 후크에서: 플래그 또는 원자 변수를 false로 설정합니다. 파일 쓰기를 중지하도록 메인 스레드에 신호를 보냅니다.
  4. 메인 스레드에서: 쓰기 루프 내부의 플래그 또는 원자 변수를 확인하세요. false가 되면 쓰기를 중지하고 보류 중인 모든 작업을 완료합니다.
  5. 스레드 조인: 쓰기가 완료되면 메인 스레드(또는 다른 작업 스레드)를 조인하여 모든 스레드가 실행이 완료되었습니다.

예는 다음과 같습니다.

keepRunning 변수 추가:

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

run() 수정 메서드:

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

main()에 종료 후크를 추가합니다.

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

JVM이 종료 신호를 수신할 때(예: Ctrl C ), 종료 후크는 keepRunning을 false로 설정합니다. 그런 다음 run() 메소드는 keepRunning이 false가 될 때까지 데이터 쓰기를 계속하여 프로그램이 종료되기 전에 현재 배치가 완료되도록 합니다.

위 내용은 종료 후크는 어떻게 Java에서 프로그램의 정상적인 종료를 보장할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.