JAvaフックを閉じる

6389 ワード

ユーザーはプログラムを閉じて、いくつかの後始末をする必要がありますが、問題は、一部のユーザーが推奨される方法でアプリケーションを閉じず、後始末ができないことです.tomcat呼び出しserverのstartメソッドのようにコンテナを起動し、startを段階的に呼び出します.シャットダウンコマンドを発行するとシャットダウン機能が起動しますが、シャットダウンには予期せぬ事故が発生し、アプリケーションが作成したシャットダウン方法にアクセスしない可能性があります.この問題をどのように解決すれば、事故があっても正常にクローズプロセスに入ることができます.
幸いjavaはこの問題を解決する優雅な方法を提供しています.閉じた善後処理のコードを実行できるようにする.JAvaのクローズフックは、ユーザーがアプリケーションをどのように終了しても、常に実行されることを保証します.ユーザーkillを除いて、これは死の穴です.
Javaの場合、仮想機会は以下のいくつかの操作をオフにします.
(1)システム呼び出しシステム.exit()メソッド
(2)プログラムの最後のデーモンスレッドが終了すると,アプリケーションは正常に終了する.
(3)ctrl+cなどの他の方法でjavaプログラムを中断するなど,ユーザがプログラムの実行を強制的に中断する
幸いなことに、仮想マシンはシャットダウン操作を実行するときに、次の2つの段階を経ます.
(1)仮想マシンは登録済みのすべてのクローズフックを起動し、もしあれば.クローズフックはRunTimeクラスで以前に登録されたスレッドであり、すべてのクローズフックは同時に実行され、タスクが完了するまで実行される.
(2)仮想マシンは、状況に応じて呼び出されたかどうかの端子(finalizer)を呼び出す.(ここでは議論しない)
フックの生成をオフにします.
    1.Threadのサブクラスの作成
    2.runメソッドを実装し、アプリケーションが閉じたときに呼び出されます.startメソッドを呼び出す必要はありません.
    3.アプリケーションでフッククラスをインスタンス化するには
    4.Runtimeでクローズフックを登録する
例は次のとおりです.
ShutdownHookDemo
package test;
public class ShutdownHookDemo {

  public void start() {
    System.out.println("Demo");
    ShutdownHook shutdownHook = new ShutdownHook();
    Runtime.getRuntime().addShutdownHook(shutdownHook);
  }

  public static void main(String[] args) {
    ShutdownHookDemo demo = new ShutdownHookDemo();
    demo.start();
    try {
      System.in.read();
    }
    catch(Exception e) {
    }
    System.out.println("Normal exit");
  }
}

class ShutdownHook extends Thread {
  public void run() {
    System.out.println("Shutting down");
  }
}

 
MySwingApp
package ex16.pyrmont.shutdownhook;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;

public class MySwingApp extends JFrame {
  JButton exitButton = new JButton();
  JTextArea jTextArea1 = new JTextArea();
  String dir = System.getProperty("user.dir");
  String filename = "temp.txt";

  public MySwingApp() {
    exitButton.setText("Exit");
    exitButton.setBounds(new Rectangle(304, 248, 76, 37));
    exitButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        exitButton_actionPerformed(e);
      }
    });
    this.getContentPane().setLayout(null);
    jTextArea1.setText("Click the Exit button to quit");
    jTextArea1.setBounds(new Rectangle(9, 7, 371, 235));
    this.getContentPane().add(exitButton, null);
    this.getContentPane().add(jTextArea1, null);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setBounds(0,0, 400, 330);
    this.setVisible(true);
    initialize();
  }

  private void initialize() {
    // create a temp file
    File file = new File(dir, filename);
    try {
      System.out.println("Creating temporary file");
      file.createNewFile();
    }
    catch (IOException e) {
      System.out.println("Failed creating temporary file.");
    }
  }

  private void shutdown() {
    // delete the temp file
    File file = new File(dir, filename);
    if (file.exists()) {
      System.out.println("Deleting temporary file.");
      file.delete();
    }
  }

  void exitButton_actionPerformed(ActionEvent e) {
    shutdown();
    System.exit(0);
  }

  public static void main(String[] args) {
    MySwingApp mySwingApp = new MySwingApp();
  }
}

 
MySwingAppWithShutdownHook
package test;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;

public class MySwingAppWithShutdownHook extends JFrame {
  JButton exitButton = new JButton();
  JTextArea jTextArea1 = new JTextArea();
  String dir = System.getProperty("user.dir");
  String filename = "temp.txt";

  public MySwingAppWithShutdownHook() {
    exitButton.setText("Exit");
    exitButton.setBounds(new Rectangle(304, 248, 76, 37));
    exitButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        exitButton_actionPerformed(e);
      }
    });
    this.getContentPane().setLayout(null);
    jTextArea1.setText("Click the Exit button to quit");
    jTextArea1.setBounds(new Rectangle(9, 7, 371, 235));
    this.getContentPane().add(exitButton, null);
    this.getContentPane().add(jTextArea1, null);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setBounds(0,0, 400, 330);
    this.setVisible(true);
    initialize();
  }

  private void initialize() {
    // add shutdown hook
    MyShutdownHook shutdownHook = new MyShutdownHook();
    Runtime.getRuntime().addShutdownHook(shutdownHook);

    // create a temp file
    File file = new File(dir, filename);
    try {
      System.out.println("Creating temporary file");
      file.createNewFile();
    }
    catch (IOException e) {
      System.out.println("Failed creating temporary file.");
    }
  }

  private void shutdown() {
    // delete the temp file
    File file = new File(dir, filename);
    if (file.exists()) {
      System.out.println("Deleting temporary file.");
      file.delete();
    }
  }

  void exitButton_actionPerformed(ActionEvent e) {
    shutdown();
    System.exit(0);
  }

  public static void main(String[] args) {
    MySwingAppWithShutdownHook mySwingApp = new MySwingAppWithShutdownHook();
  }

  private class MyShutdownHook extends Thread {
    public void run() {
      shutdown();
    }
  }
}