我正在编写一个多线程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;
}
}
答案 0 :(得分:3)
实施finalize
会产生非常糟糕的副作用。回到过去,Java很慢,其中一个原因是需要在每个创建的对象上运行finalize
。现在,JVM足够聪明,可以检查是否存在非平凡的finalize
实现,而不是盲目地在每个收集的对象上调用它。只有一个类实现finalize
可能并不坏,但不要养成习惯。
如果您想在正常关闭JVM期间做一些特别的事情,请使用shutdown hook。