我遇到一个问题,当我在同一端口上运行应用程序的第二个实例时,我得到了// error: call of overloaded 'cast<int, float>(unsigned int)' is ambiguous
std::cout << cast<int,float>(10u) << "\n";
问题是出现此异常后,我的应用程序继续运行。
几个小时后,我注意到(使用“获取线程转储”工具),即使main死后,仍有一些线程仍然存在。
我无权访问那些线程,这意味着我无法以正确中断它们的方式进行设计
此外,SocketException: java.net.BindException: Address already in use: bind
-没有任何帮助。
如何停止该线程?
我正在处理非常大的旧版应用程序,并且要停止的线程是在我无法访问的库中创建的
答案 0 :(得分:7)
您不能强行停止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
在现代Java上不起作用,因为该“模型”(在线程中抛出一个特殊的异常,无论现在在何处)仅是导致错误的软件的原因(因为锁等不太可能成为)正确关闭等):因此,它已被弃用十年,并且不再可用。即使这样做,线程也可以阻止您停止它。
哪种方法可以引导我们肯定,绝对地杀死线程:
System.exit(0);
就可以了。常见的误解是,“好”的代码风格是永不那样强制退出,而正确的风格是告诉所有(非守护进程状态)活动线程清理其业务并退出。
这是错误的。刚刚退出。您的代码应编写为不需要进行任何资源清理,因为如果您这样编写代码,则意味着如果有人因使用电源线而跳闸或Java被强行杀害,则您的应用程序只会造成混乱。您要做的少量清理作业应注册为关闭挂钩。
因此,如果要退出VM,只需System.exit
。
答案 1 :(得分:1)
当然,第一件事就是尝试修复代码的另一端。 如果您不能这样做,并且同时您可以保留这些线程-您可以在它们上调用中断;再次,希望编写该代码的人知道如何处理这些中断。
否则,除非您认为System::exit
是一个选项并且重新启动,否则您将完全不走运。但是,这并不是您真正的问题,因为您无法控制其他一些资源不会自行清理。
即使它们确实响应中断,但是如果您将数据库/文件管理器/任何文件置于损坏状态,该怎么办?