【问题标题】:Stopping a Java service with many threads running停止运行多个线程的 Java 服务
【发布时间】:2016-01-01 05:46:04
【问题描述】:

我有一个多线程的 Java 服务。这是一个发布者-订阅者应用程序。

有一个消息总线,并且有几个插件组件监听消息总线。来自插件的每个请求都由消息总线在单独的线程中处理。它作为 Windows 服务运行。

在停止方法中,目前我正在做的是调用System.exit(0)。在其他几个类似的问题中,有些人说这是一种不好的做法,而另一些人则声称这很好。就连 Sonarqube 也会抱怨。

那么停止所有这些线程的优雅方法是什么?我应该打电话给他们Thread.interrupt吗?

这些客户端持续监听消息总线,如果收到任何事件消息,它们就会处理它。

【问题讨论】:

  • 如果您知道中断线程正在执行的任何操作都是安全的,System.exit(0) 很好,实际上更可取。如果一个线程可能正在做某事——比如写入一个文件——不能被安全地中断,那么你需要更加小心。
  • 如果我的答案符合目的,您能否将我的答案标记为正确?
  • @AadityaGavandalkar 我可以使用 thread.interrupt 来中断主线程。但是如何关闭线程并退出?简而言之,我的停止方法实现是什么?我试过这个但没有用。 stackoverflow.com/questions/34589614/…

标签: java windows multithreading service thread-safety


【解决方案1】:

使用Thread.interrupt() 是一种完全可以接受的方式。原因是,如果您处于可中断的阻塞调用中(例如 Thread.sleep 或使用 java.nio 通道操作),您实际上可以立即摆脱这些调用。

有关此SO question 和here 的更多详细信息

更详细的解释请访问:here

总结:

  • thread.interrupt() 不会停止线程。它用于 多线程程序中的协调。除非你知道,否则不要使用它 正是你所做的。
  • 抛出 RuntimeException 将(通常) 终止线程,但不一定终止程序。
  • System.exit(int) 几乎总是终止程序并返回一个 状态码。
  • 在不寻常的情况下,System.exit(int) 可能不会真正停止程序。
  • 另一方面,Runtime.getRuntime().halt(int) 总是这样。

【讨论】:

  • 但是当调用 System.exit 时,它确实会使用 Thread.interrupt 杀死线程,对吧?那么为什么这是一种不好的做法呢?
  • 在停止线程后,我们应该确保线程真正停止,然后程序才能继续做其他事情。为此,我们可以简单地在调用线程调用 Thread.join() ,它会一直等到工作线程停止。这在你调用System.exit()后无法实现@
  • 我猜 OP 不希望程序继续做其他事情,所以虽然 System.exit() 无法实现,但它似乎不是 OP 正在寻找的东西为。
  • 当您调用 System.exit() 时,它将在该点停止线程的执行并且不调用任何 finally 块(我假设它可能包含清理代码,因为这样做是一个好习惯) .
猜你喜欢
  • 2011-02-17
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2012-12-24
  • 2020-01-23
  • 1970-01-01
相关资源
最近更新 更多