我的应用程序启动了一个使用blockingQueue的守护线程。当使用kill -3杀死它时,应用程序不会干净地停止,结果堆栈显示它仍在等待BlockingQueue.take()
。
如果您有任何建议可以帮助您顺利关机,我将不胜感激
你说…
...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应用程序关闭是在应用程序内部发起的。
看看如何在Java中优雅地处理SIGKILL信号
BlockingQueue#take
响应中断,所以你只需要确保你中断了执行take
方法的线程,并充分处理抛出的InterruptedException
(即退出该方法)。
如果有问题的线程是由线程池管理的,您可以shutdownNow
这个线程池,这也会中断线程。