【问题标题】:Give program time to shutdown threads but with System.exit backup plan?给程序时间来关闭线程但使用 System.exit 备份计划?
【发布时间】:2018-02-19 19:36:34
【问题描述】:

有时,Java 应用程序的系统进程不会完全关闭。这主要是因为一个或多个线程没有死。

可以调用:

System.exit(0);

但这会杀死所有线程。

我希望我的所有线程都能正确关闭,所以我不打算使用 System.exit。但有时由于环境的原因,一个或多个线程不会正确死亡。这会导致应用程序无法完全关闭并在后台逗留,有时甚至会锁定资源。

我的第一个想法是编写一个 ExitWatcher,它在程序停止时启动,并在 10 秒后调用 system.exit(如果程序仍然存在)。我很快发现 ExitWatcher 现在可以阻止程序关闭 ;-)

如何给 java 程序正确关闭的时间(即正确关闭所有线程),但同时有一个备份计划,如果关闭时间太长,则调用 System.exit?

【问题讨论】:

  • 正如 Kayaman 提到的,我认为您可以将 ExitWatcher 线程设置为守护进程,但整个想法也令人担忧。如果某些重要数据的保存时间超过 10 秒(比如通过慢速网络连接)怎么办?好像你只是在踢自己的脚。最好专注于单个线程,并确保它们在完成后都会退出。

标签: java multithreading


【解决方案1】:

当您不希望线程阻止程序退出时,您可以使用守护线程(因此在您的ExitWatcher 线程上使用setDaemon(true) 可以解决您的直接问题)。但是我怀疑您是否真的需要或想要一个 ExitWatcher,因为通过适当的设计通常可以相对轻松地防止此类情况。

正确的关闭程序包括中断处于活动状态的线程(并对其进行设计以使其在中断时表现良好)、在必要时使用守护线程、正确关闭连接等。使用像 ExitWatcher 这样的机制更像是一种骇人听闻的方法,因为它表明您的程序在关闭时并不总是表现良好。

【讨论】:

  • 感谢@Kayaman,setDaemon 技巧效果很好!跟踪线程并正确关闭它们确实是一件好事,这是我不使用 System.exit 的原因之一。但在某些情况下,这会导致问题导致用户需要重新启动计算机才能让一切恢复正常。拥有像 ExitWatcher 这样的东西并不是什么好东西,但有时比替代品更好。
  • ExitWatcher 的最佳替代方案是修复程序中的错误。这种机制唯一合理的地方是当你运行别人的代码时。这就是为什么如果您的 web 应用程序表现不佳,应用程序服务器会在日志中填充各种警告和诅咒。它试图说“修复你的程序,我无能为力”。
猜你喜欢
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2013-10-31
  • 2015-03-28
相关资源
最近更新 更多