-1

java.lang.Thread.setDaemon(boolean)

実行中のスレッドがすべてデーモン スレッドのみの場合、Java 仮想マシンは終了します。

まだ下のコードでは、プロセスを中断している間(OSスタイル)に「安全にシャットダウン」が発生することはなく、SIGKILLを使用していません...

ドキュメンテーションが間違っているので (?)、すべての非デーモン スレッドを追跡し、シャットダウン フックでそれらに参加する唯一の手段ですか?

public class Main {
  public static void main(String... args) {
    Runtime.getRuntime().addShutdownHook(new Thread() {
      public void run() {
        System.out.println("shutdown hook activated");
      }
    });
    new Thread(new Runnable() {
      public void run() {
        while (true) {
          try {
            System.out.println("sleeping for 1000 seconds!");
            Thread.sleep(1000000);
          } catch (InterruptedException e) {
            System.out.println("INTERRUPTED");
            break;
          }
        }
        System.out.println("SAFELY SHUTTING DOWN");
      }
    }).start();
  }
}
4

2 に答える 2

1

の javadoc に注意してくださいRuntime#addShutdownHook(Thread)

Java 仮想マシンは、次の 2 種類のイベントに応答してシャットダウンします。

  • 最後の非デーモン スレッドが終了するか、exit (同等の System.exit) メソッドが呼び出されると、プログラムは正常に終了します。
  • 仮想マシンは、入力などのユーザー割り込み^C、またはユーザー ログオフやシステム シャットダウンなどのシステム全体のイベントに応答して終了します。

^CSIGINT は、コマンド ラインと同等のユーザー割り込みです。

この javadoc は、これらの条件でシャットダウン フックがどのように動作するかを示しています。

引用したjavadocは、JVMがデーモンスレッドのコンテキストでどのように動作するかを説明しています。

それらは相互に排他的ではありません。さらに、実行中のスレッドが中断されることを示すものは何もありません。

于 2014-08-27T21:24:38.613 に答える