作者:粪青12_601 | 来源:互联网 | 2022-12-03 12:13
我遇到一个问题,当我在同一个端口上运行我的应用程序的第二个实例时 - 我得到了 SocketException: java.net.BindException: Address already in use: bind
问题是,在获得此异常后,我的应用程序继续运行.
几个小时后我注意到(使用"获取线程转储"工具)即使在main死亡之后仍有一些线程仍然存在.
我无法访问那些线程,这意味着我无法设计它以便我可以正确地中断它们
而且,thread.interrupt, thread.setDaemon(true), thread.stop
- 没有什么帮助我.
如何阻止那些线程?
我正在研究非常大的遗留应用程序和我想要停止的线程是在我无法访问的库中创建的
1> rzwitserloot..:
你不能强行停止java中的线程.该线程必须与您合作:它需要一个看起来像这样的核心循环:
while (running && !Thread.interrupted()) {
// do something that won't take long.
try {
Thread.sleep(1000L); // or some other 'wait a while' code.
} catch (InterruptedException e) {
return;
}
}
如果线程的代码没有这个,并且您无法更改它,那么您可以做很多事情.Thread.stop
在现代javas上不起作用,因为那个'模型'(在线程中抛出一个特殊的异常,现在它就是这样)只是使得有缺陷的软件(因为锁等等不太可能被正确关闭等) :因此它已被弃用了十年,现在已经不再适用了.即使它确实如此,一个线程也可以阻止你阻止它.
这导致我们绝对绝对杀死一个线程的一种万无一失的方式:
System.exit(0);
那就行了.一种常见的误解是"好"的代码风格永远不会强行退出,正确的风格是告诉所有(非守护程序状态)活动线程清理他们的业务并退出.
这是错误的.刚退出 你的代码应该写成不需要进行任何资源清理,因为如果你这样写,那就意味着如果有人绊倒了电源线或者java很难被杀死,你的应用程序就会造成一团糟.您拥有的少数清理作业应该注册为关闭挂钩.
所以,如果你想退出VM,只需System.exit
.
小修正:Thread.stop及其兄弟已被弃用了二十年.