停止运行许多线程的Java服务

时间:2016-01-01 05:46:04

标签: java windows multithreading service thread-safety

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

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

在stop方法中,我正在做的是调用System.exit(0)。在其他几个类似的问题中,有些人说这是一个不好的做法,而另一些人则认为这很好。甚至Sonarqube抱怨它。

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

这些客户端不断收听消息总线,如果收到任何事件消息,则会对其进行处理。

1 个答案:

答案 0 :(得分:1)

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

有关此SO questionhere

的详细信息

有关详细说明,请访问:here

  

要点:

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