我有一个关于在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
?
答案 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();
}
}
}
这会更好吗?