Java VM因BlockingQueue.take()而未关闭

时间:2013-03-22 12:09:18

标签: java concurrency blockingqueue

我的应用启动了一个使用blockingQueue的守护程序线程。当使用kill -3杀死它时,应用程序不会干净地停止,结果堆栈显示它仍在等待BlockingQueue.take()

任何有助于干净关机的建议都将深表赞赏

2 个答案:

答案 0 :(得分:1)

你说......

...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应用程序关闭源自应用程序 看看How to gracefully handle the SIGKILL signal in Java

答案 1 :(得分:0)

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

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