我的应用程序启动使用blockingQueue的守护进程线程。当它使用kill -3杀死时,应用程序不会完全停止,并且由此产生的堆栈显示它仍在等待BlockingQueue.take()
。由于BlockingQueue.take导致Java虚拟机未关闭()
任何建议,以帮助干净的关闭将深表赞赏
我的应用程序启动使用blockingQueue的守护进程线程。当它使用kill -3杀死时,应用程序不会完全停止,并且由此产生的堆栈显示它仍在等待BlockingQueue.take()
。由于BlockingQueue.take导致Java虚拟机未关闭()
任何建议,以帮助干净的关闭将深表赞赏
你说......
...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
谢谢你的清晰解释。 Kill -2为我工作并干净地关闭应用程序(调用所有运行时钩子) – qwerty 2013-03-26 12:22:30
BlockingQueue#take
响应中断,所以你只需要确保你的中断执行take
方法的线程和处理抛出InterruptedException
充分(即通过退出方法)。
如果有问题的线程由线程池管理,您可以shutdownNow
池,它也会中断线程。
从任务管理器中kill java.exe。 – sgowd 2013-03-22 12:11:00
这个守护线程中的'Runnable'看起来像什么? – 2013-03-22 12:12:50
您可以在关机时中断队列 – 2013-03-22 12:13:24