Java使用finalize进行子线程关闭?

时间:2012-10-26 02:55:20

标签: java multithreading console-application finalizer

我正在编写一个多线程java控制台应用程序,我打算通过Ctrl-C杀死它。在这种情况下,如果我有一个封装单个线程的类,那么在封装类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;
  }
}

1 个答案:

答案 0 :(得分:3)

实施finalize会产生非常糟糕的副作用。回到过去,Java很慢,其中一个原因是需要在每个创建的对象上运行finalize。现在,JVM足够聪明,可以检查是否存在非平凡的finalize实现,而不是盲目地在每个收集的对象上调用它。只有一个类实现finalize可能并不坏,但不要养成习惯。

如果您想在正常关闭JVM期间做一些特别的事情,请使用shutdown hook