我有一个多线程的Java服务。这是发布者 - 订阅者应用程序。
有一条消息总线,有几个插件组件正在监听消息总线。来自插件的每个请求都由消息总线在单独的线程中处理。它作为Windows服务运行。
在stop方法中,我正在做的是调用System.exit(0)
。在其他几个类似的问题中,有些人说这是一个不好的做法,而另一些人则认为这很好。甚至Sonarqube抱怨它。
那么停止所有这些线程的优雅方式是什么?我应该打电话给Thread.interrupt
吗?
这些客户端不断收听消息总线,如果收到任何事件消息,则会对其进行处理。
答案 0 :(得分:1)
使用Thread.interrupt()
是完全可以接受的方式。原因是,如果您处于可中断的阻塞调用(如Thread.sleep或使用java.nio Channel操作),您实际上可以立即突破这些调用。
有关此SO question和here
的详细信息有关详细说明,请访问:here
要点:
- thread.interrupt()不会停止线程。它用于 多线程程序中的协调。除非你知道,否则不要使用它 正是你做的。
- 抛出RuntimeException(通常) 终止线程,但不一定是程序。
- System.exit(int)几乎总是终止程序并返回一个 状态代码。
- 在异常情况下,System.exit(int)可能实际上不会停止程序。
另一方面,- Runtime.getRuntime()。halt(int),总是这样。