Java使用finalize关闭子线程?

Java使用finalize关闭子线程?,java,multithreading,console-application,finalizer,Java,Multithreading,Console Application,Finalizer,我正在编写一个多线程java控制台应用程序,我打算通过Ctrl-C杀死它。在这种情况下,如果我有一个封装了单个线程的类,那么在封装类finalize方法中关闭子线程是否是一个好的做法 如果您在按住Ctrl-C键的同时未正确关闭所有线程,是否可以让原始应用程序的工件保持运行 伪代码: public class ParentClass { Thread childThread = new Thread(new ExampleRunnable()); @Override protected v

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

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


如果您想在JVM正常关闭期间执行一些特殊的操作,那么请使用。

不能保证finalize方法得到执行。另外,请注意,所有线程都是由JVM控制的,如果JVM关闭,所有线程也将死亡。当然,但拥有它是否有害和/或是否存在有益的情况?在提供的示例中,这就像是在一些可能永远不会执行的事情上增加努力。那么,当JVM处理Ctrl-C事件时,是否可以安全地假设这样的子线程将被正确地处理?当子线程像这样终止时,我如何确保它们在何处终止,即完成最后一个执行循环。是否存在中断的异常或引发的问题?如果需要确保在触发
SIGINT
后执行代码,则应使用
Runtime.getRuntime().addShutdownHook()
如果在特定线程中不执行任何特殊操作,不显式关闭它,是否安全?这是简单线程的标准做法吗?如果应用程序中的每个线程都没有关机挂钩,那么这种做法会被视为不好的做法吗?这取决于线程在做什么。我要说的是,大多数Java程序员都使用
ThreadPoolExecutor
,而不是
新线程
。老实说,我还没有见过很多人考虑过应用程序在自然终止后是如何关闭的。事实上,我曾经与没有框架编写服务的人合作过,他们只是让应用程序在没有清理的情况下消亡。我不认为为每个线程添加一个关闭钩子是正常的。我认为这个想法是使用关机钩子来确保采取了最后的行动,比如将数据提交到磁盘或干净地关闭网络连接。感谢您的对话。我会给你支票的。这里的javaapi看起来很混乱。它似乎很奇怪,必须使另一个线程和同步访问它关闭一个线程我已经运行!难道他们不能在runnable接口中有一个类似于关闭钩子的方法吗?如果在应用程序的整个生命周期中有许多短任务要执行,那么我认为使用ThreadPoolExecutor很有意义,但是如果知道单个线程是整个应用程序中唯一的实例,那么使用ThreadPoolExecutor不是更简单吗?如果所讨论的线程正在执行一些需要有序关闭的重要任务,那么您只需要这样做。否则,完全可以让JVM突然停止它。还请注意,
Thread
不是
final
,因此您可以创建一个子类Thread,该子类使用一个静态共享的shutdown hook注册自己,该hook中断并连接子类的每个实例。