如何杀死第三方库设计的应用程序中的所有线程

时间:2018-10-02 13:55:18

标签: java multithreading

我遇到一个问题,当我在同一端口上运行应用程序的第二个实例时,我得到了// 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-没有任何帮助。

如何停止该线程?

我正在处理非常大的旧版应用程序,并且要停止的线程是在我无法访问的库中创建的

2 个答案:

答案 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是一个选项并且重新启动,否则您将完全不走运。但是,这并不是您真正的问题,因为您无法控制其他一些资源不会自行清理。

即使它们确实响应中断,但是如果您将数据库/文件管理器/任何文件置于损坏状态,该怎么办?