Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何杀死应用程序中由第三方库设计的所有线程_Java_Multithreading - Fatal编程技术网

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

Java 如何杀死应用程序中由第三方库设计的所有线程,java,multithreading,Java,Multithreading,我面临一个问题,当我在同一端口上运行应用程序的第二个实例时,我得到了SocketException:java.net.bindeexception:Address ready in use:bind 问题是,在获得此异常后,我的应用程序将继续运行 几个小时后,我注意到(使用“getthreaddump”工具)有些线程即使在main死后仍然活着 我无法访问该线程,这意味着我无法以能够正确中断线程的方式进行设计 另外,thread.interrupt、thread.setDaemon(true)、t

我面临一个问题,当我在同一端口上运行应用程序的第二个实例时,我得到了
SocketException:java.net.bindeexception:Address ready in use:bind

问题是,在获得此异常后,我的应用程序将继续运行

几个小时后,我注意到(使用“getthreaddump”工具)有些线程即使在main死后仍然活着

我无法访问该线程,这意味着我无法以能够正确中断线程的方式进行设计

另外,
thread.interrupt、thread.setDaemon(true)、thread.stop
-没有任何帮助

如何阻止这种情况


我正在处理非常大的遗留应用程序,我想停止的线程是在我不访问的库中创建的

您不能强制停止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,就不能强制停止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,当然首先要做的是尝试修复代码的另一面。如果你不能做到这一点,同时你可以得到这些线程-你可以调用中断对他们;同样,希望编写代码的人知道如何处理这些中断

否则,您就完全不走运了,除非
System::exit
是一个选项,我想是重新启动。但再次,这并不是你真正的问题,一些其他资源,失控,不清理后自己


即使它们对中断做出响应,如果您的数据库/文件管理器/任何东西处于损坏状态,该怎么办

当然,首先要做的是尝试修复代码的另一面。如果你不能做到这一点,同时你可以得到这些线程-你可以调用中断对他们;同样,希望编写代码的人知道如何处理这些中断

否则,您就完全不走运了,除非
System::exit
是一个选项,我想是重新启动。但是,这并不是你真正的问题,一些其他资源,在你控制之外,在它们自己之后没有清理


即使它们对中断做出响应,如果您的数据库/文件管理器/任何东西处于损坏状态,该怎么办

你好。您能提供更多关于您正在使用哪种应用程序的信息吗?您的基础架构是什么?可能我不太了解,但似乎您希望应用程序在遇到此错误时退出。当您发现异常时,请尝试
System.exit(1)
。System.exit不是一个好主意,因为它不会杀死应用程序的所有活动。我认为,如果您能够处理这些线程,并希望它们知道如何响应中断,那么您唯一明智的做法就是中断这些线程。您能提供更多关于您正在使用哪种应用程序的信息吗?您的基础架构是什么?可能我不太了解,但似乎您希望应用程序在遇到此错误时退出。当您捕获到异常时,只需尝试
System.exit(1)
。System.exit是一个坏主意,因为它不会杀死应用程序的所有活动。我认为您可以尝试的唯一明智的方法是中断这些线程,如果您能及时处理它们的话