2

我正在编写一个多线程 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;
  }
}
4

1 回答 1

3

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

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

于 2012-10-26T03:11:39.977 回答