我的应用程序启动了一个使用阻塞队列的守护线程。当使用 kill -3 杀死它时,应用程序不会完全停止,并且生成的堆栈显示它仍在等待BlockingQueue.take()
。
任何有助于彻底关闭的建议将不胜感激
我的应用程序启动了一个使用阻塞队列的守护线程。当使用 kill -3 杀死它时,应用程序不会完全停止,并且生成的堆栈显示它仍在等待BlockingQueue.take()
。
任何有助于彻底关闭的建议将不胜感激
你说...
...When it is killed using kill -3, the app doesnt stop cleanly and the...
通常,使用 Kill -3 不会终止 Java 应用程序。
Kill SIGQUIT (-3) 用于获取 Java 线程转储。
尝试使用 kill -9 或 -15
如果启用了一些特殊的信号处理钩子,这种行为可能会改变。
编辑:
此外,受控、干净的 Java 应用程序关闭源自应用程序内。
看看如何在 Java 中优雅地处理 SIGKILL 信号
BlockingQueue#take
响应中断,因此您只需要确保中断执行该take
方法的线程并充分处理抛出InterruptedException
的问题(即退出该方法)。
如果有问题的线程由线程池管理,您可以shutdownNow
使用该池,这也会中断线程。