2

Ctrl-Cで強制終了するマルチスレッドのJavaコンソールアプリケーションを作成しています。この状況で、単一のスレッドをカプセル化するクラスがある場合、カプセル化するクラスのfinalizeメソッドで子スレッドをシャットダウンすることをお勧めしますか?

元のアプリをCtrl-Cして、すべてのスレッドが適切にシャットダウンされない場合、元のアプリケーションのアーティファクトを実行したままにすることは可能ですか?

擬似コード:

public class ParentClass {

Thread childThread = new Thread(new ExampleRunnable());

  @Override protected void finalize() throws Throwable {
   childThread.shutdown();
  }
}

public class ExampleRunnable implements Runnable {

 private volatile boolean alive = false;

 @Override
 public void run() {
  alive = true;
  while(alive) {
   //do some work
  }
 }

  public void shutdown() {
   alive = false;
  }
}
4

1 に答える 1

3

実装finalizeすると、ひどく悪い副作用が発生する可能性があります。昔は、Javaは遅く、その理由の1つは、finalizeこれまでに作成されたすべてのオブジェクトで実行する必要があることでした。これで、JVMは、finalize収集されるすべてのオブジェクトで盲目的に呼び出すのではなく、重要な実装が存在するかどうかをチェックするのに十分スマートです。クラスを1つだけ実装finalizeすることは悪いことではないかもしれませんが、それを習慣にしないでください。

JVMの通常のシャットダウン中に何か特別なことをしたい場合は、シャットダウンフックを使用してください。

于 2012-10-26T03:11:39.977 に答える