Java - 打断线程?

时间:2011-12-06 18:09:11

标签: java multithreading

我有一个关于在Java中断线程的问题。假设我有Runnable

public MyRunnable implements Runnable {
    public void run() {
        operationOne();
        operationTwo();
        operationThree();
    }
}

我想实现这样的事情:

Thread t = new Thread(new MyRunnable());
t.run();

... // something happens
    // we now want to stop Thread t

t.interrupt(); // MyRunnable receives an InterruptedException, right?

... // t is has now been terminated.

如何在Java中实现它?具体来说,我如何捕捉InterruptedException中的MyRunnable

5 个答案:

答案 0 :(得分:2)

我建议您测试Thread.isInterrupted()。 Javadoc here。这里的想法是你正在做一些工作,很可能是在循环中。在每次迭代时,您应检查中断标志是否为真并停止工作。

while(doingWork && !Thread.isInterrupted() {
  // do the work
}

编辑:要明确,如果子任务没有阻塞或最差,您的线程将不会收到InterruptedException,吃掉该异常。检查标志是正确的方法,但不是每个人都遵循它。

答案 1 :(得分:1)

首先,第二段代码的第二行应该是t.start(),而不是t.run()。 t.run()只是在线调用你的run方法。

是的,MyRunnable.run()必须定期检查Thread.currentThread()。isInterrupted()。由于你可能想要在Runnable中做的很多事情涉及InterruptedExceptions,我的建议是咬紧牙关并与他们一起生活。定期调用效用函数

public static void checkForInterrupt() throws InterruptedException {
   if (Thread.currentThread().isInterrupted())
      throw new InterruptedException();
}

编辑添加

由于我看到海报无法控制各个操作的评论,因此他的MyRunnable.run()代码应该看起来像

public void run() {
  operation1();
  checkForInterrupt();
  operation2();
  checkForInterrupt();
  operation3();
}

答案 2 :(得分:0)

我认为上面的答案非常适合你的问题。我只想在InterruptedException

上添加一些内容

Javadoc说:

  

InterruptedException:当线程正在等待,休眠或者抛出时抛出   否则暂停很久,另一个线程中断它   在Thread类中使用interrupt方法。

这意味着在运行

时不会抛出InterruptedException
operationOne();
operationTwo();
operationThree();

除非您正在睡觉,等待锁定或在这三种方法的某处暂停。

编辑如果提供的代码无法按照周围好的有用答案的建议进行更改,那么恐怕您无法中断线程。与其他语言(如C#)相似,可以通过调用Thread.Abort()来中止线程.Java没有这种可能性。请参阅此link以了解有关确切原因的更多信息。

答案 3 :(得分:0)

只有当线程被阻塞(等待,睡眠等)时才会抛出InterruptedThreadException。否则,您必须检查Thread.currentThread().isInterrupted()

答案 4 :(得分:-1)

首先,应该在那里上课

public class MyRunnable extends Thread {
    public void run() {
        if(!isInterrupted()){
            operationOne();
            operationTwo();
            operationThree();
        }
    }
}

这会更好吗?