【问题标题】:Java VM not shutting down due to BlockingQueue.take()由于 BlockingQueue.take(),Java VM 未关闭
【发布时间】:2013-03-22 12:09:18
【问题描述】:

我的应用启动了一个使用阻塞队列的守护线程。当使用 kill -3 杀死它时,应用程序不会完全停止,并且生成的堆栈显示它仍在等待BlockingQueue.take()

任何有助于彻底关闭的建议将不胜感激

【问题讨论】:

  • 从任务管理器中杀死 java.exe。
  • 这个守护线程中的Runnable是什么样的?
  • 关机时可以打断队列
  • 当你说“守护线程”时,你有没有调用Thread.setDaemon(true)

标签: java concurrency blockingqueue


【解决方案1】:

你说...

...When it is killed using kill -3, the app doesnt stop cleanly and the...

通常,Java 应用程序不会通过使用 Kill -3 来终止。

Kill SIGQUIT (-3) 用于获取 Java 线程转储。

尝试使用 kill -9 或 -15

如果启用了一些特殊的信号处理钩子,这种行为可能会改变。

编辑:

此外,受控、干净的 Java 应用程序关闭源自应用程序内。
看看How to gracefully handle the SIGKILL signal in Java

【讨论】:

  • 感谢您的清晰解释。 Kill -2 为我工作并干净地关闭应用程序(调用所有运行时挂钩)
【解决方案2】:

BlockingQueue#take 响应中断,因此您只需确保中断执行take 方法的线程并充分处理抛出的InterruptedException(即通过退出方法)。

如果有问题的线程由线程池管理,您可以shutdownNow 池,这也会中断线程。

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多