종료 후크는 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>
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!