如何在Java中停止不间断线程

时间:2010-12-29 17:48:11

标签: java multithreading

我有一个 我无法编辑 的Java应用程序,它启动了java.lang.Thread方法run()

public void run(){
   while(true){
     System.out.println("Something");
   }
}

在某个时间点我想阻止它。如果我使用Thread.interrupt()则不起作用。 如果我使用Thread.stop()它可以使用,但不推荐使用此方法(因此不鼓励使用它,因为它可能会在新版本中从JVM中删除)。

如何在Java中停止这种不间断的线程?

6 个答案:

答案 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)

在此链接下:http://download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

如果某个线程没有响应Thread.interrupt怎么办?

在某些情况下,您可以使用特定于应用程序的技巧。例如,如果线程正在等待已知套接字,则可以关闭套接字以使线程立即返回。不幸的是,确实没有任何技术可以发挥作用。 应该注意的是,在所有等待线程都没有响应Thread.interrupt的情况下,它也不会响应Thread.stop。这种情况包括故意的拒绝服务攻击,和thread.stop和thread.interrupt无法正常工作的I / O操作。

答案 2 :(得分:3)

如果没有来自该线程的合作,您将无法可靠地中断线程。

作为一个丑陋的黑客(不是实际使用!),您可以替换System.out并使println在遇到中断条件时抛出异常并且有问题的线程是当前线程(即使用它作为一个钩子,在目标线程的上下文中提供一些合作。)

编辑:更优雅的选项 - 您可以通过在printlnThread.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用他们的话给了我解决方案的灵感;-),以及这个让我总能解决所有编程问题的奇妙网站。

再次感谢大家和新年快乐!