我的应用启动了一个使用blockingQueue的守护程序线程。当使用kill -3杀死它时,应用程序不会干净地停止,结果堆栈显示它仍在等待BlockingQueue.take()
。
任何有助于干净关机的建议都将深表赞赏
答案 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
池,这也会中断线程。