2013-03-22 84 views
0

我的应用程序启动使用blockingQueue的守护进程线程。当它使用kill -3杀死时,应用程序不会完全停止,并且由此产生的堆栈显示它仍在等待BlockingQueue.take()由于BlockingQueue.take导致Java虚拟机未关闭()

任何建议,以帮助干净的关闭将深表赞赏

+0

从任务管理器中kill java.exe。 – sgowd 2013-03-22 12:11:00

+0

这个守护线程中的'Runnable'看起来像什么? – 2013-03-22 12:12:50

+0

您可以在关机时中断队列 – 2013-03-22 12:13:24

回答

1

你说......

...When it is killed using kill -3, the app doesnt stop cleanly and the... 

通常一个Java应用程序不使用杀-3终止。

Kill SIGQUIT(-3)用于执行Java线程转储。

尝试用kill -9或-15

如果一些特殊的信号处理挂钩启用,此行为可能会发生改变。

编辑:

另外,控制,干净的Java应用程序停机起源的应用程序中。
看一看How to gracefully handle the SIGKILL signal in Java

+1

谢谢你的清晰解释。 Kill -2为我工作并干净地关闭应用程序(调用所有运行时钩子) – qwerty 2013-03-26 12:22:30

0

BlockingQueue#take响应中断,所以你只需要确保你的中断执行take方法的线程和处理抛出InterruptedException充分(即通过退出方法)。

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