我有一个 我无法编辑 的Java应用程序,它启动了java.lang.Thread
方法run()
:
public void run(){
while(true){
System.out.println("Something");
}
}
在某个时间点我想阻止它。如果我使用Thread.interrupt()
则不起作用。
如果我使用Thread.stop()
它可以使用,但不推荐使用此方法(因此不鼓励使用它,因为它可能会在新版本中从JVM中删除)。
如何在Java中停止这种不间断的线程?
答案 0 :(得分:8)
java调试器允许您通过向其中注入异常来终止线程。
启动Java进程并让它监听某个端口:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=4444 <Your Program>
并将调试器与以下内容连接:
jdb -attach 127.0.0.1:4444
并发出以下命令:
threads
获取正在运行的线程列表,并使用kill命令终止正在运行的线程。
kill 0xe2e new java.lang.IllegalArgumentException("er");
答案 1 :(得分:6)
如果某个线程没有响应Thread.interrupt怎么办?
在某些情况下,您可以使用特定于应用程序的技巧。例如,如果线程正在等待已知套接字,则可以关闭套接字以使线程立即返回。不幸的是,确实没有任何技术可以发挥作用。 应该注意的是,在所有等待线程都没有响应Thread.interrupt的情况下,它也不会响应Thread.stop。这种情况包括故意的拒绝服务攻击,和thread.stop和thread.interrupt无法正常工作的I / O操作。
答案 2 :(得分:3)
如果没有来自该线程的合作,您将无法可靠地中断线程。
作为一个丑陋的黑客(不是实际使用!),您可以替换System.out
并使println
在遇到中断条件时抛出异常并且有问题的线程是当前线程(即使用它作为一个钩子,在目标线程的上下文中提供一些合作。)
编辑:更优雅的选项 - 您可以通过在println
为Thread.interrupted()
时抛出异常来使true
可中断,以便线程可以被中断致电thread.interrupt()
。
此方法的语义非常接近普通的可中断方法(即抛出InterruptedException
的方法),尽管您不能使用InterruptedException
,因为它是一个经过检查的异常,需要使用未经检查的{ {1}}代替:
RuntimeException
答案 3 :(得分:1)
您可以使用检查变量实现中断方法。
首先使用volatile检查变量:
volatile boolean tostop = false; // Keep the initial value to be false
接下来,将您的线程定义为依赖于此变量。
Thread thread1 = new Thread(){
public void run() {
while(!tostop) {
-- Write your code here --
}
}
}
接下来定义使用该线程的函数:
public void ....{
//Interrupt code
tostop = true;
thread1.sleep(300); // Give the thread sometime for cleanup
//Use System.exit(0), if the thread is in main function.
}
希望这有帮助。
答案 4 :(得分:0)
我不知道任何已弃用的方法已从JRE中删除。 stop()已被弃用了很长时间,可能超过10年。使用它是一个坏主意,但它可能是你最好的选择。
答案 5 :(得分:0)
好的,我找到了解决方案,它真的非常简单,只需睡眠线程然后打断它!
final Thread t = getTheThreadToClose();
//Final is important because only in this way you can pass it to the following new Thread
if (t != null && t.isAlive() && !t.isInterrupted()){
try{
new Thread(){
public void run(){
try{
t.sleep(3000);//SLEEP INSIDE THE NEW THREAD
}
catch(InterruptedException ex){}
}
}.start();
t.interrupt();//INTERRUPT OUTSIDE THE NEW STARTED THREAD
}
catch(Exception e){}
}
它适用于所有情况!
我想感谢你们所有人提供的非常有用的帮助,特别是venomrld和Toby用他们的话给了我解决方案的灵感;-),以及这个让我总能解决所有编程问题的奇妙网站。
再次感谢大家和新年快乐!