Java虚拟机没有关闭,由于BlockingQueue.take()



我的应用程序启动了一个使用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这个线程池,这也会中断线程。

最新更新