我使用Thread.interrupt
停止线程执行,但线程执行不会停止。它还在运行。
示例:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while(i<10000){
if(Thread.currentThread().isInterrupted()){
System.out.println("Thread Interrupted but it still running");
}
System.out.println(++i);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.start();
t.interrupt();
我无法检查Thread.isInterrupted()
然后线程是否中断突破循环。我不能这样做。在这里,我只是展示示例示例。
我的疑问是Thread.interrupt
只是设置interrupted
标记,或者它确实会停止执行。
对此有任何帮助将不胜感激。
如何停止线程执行或终止正在运行的线程?
答案 0 :(得分:1)
Thread.interrupt()将真正中断实际检查该状态的操作(例如,可中断的I / O操作或者显式检查isInterrupted()的某些用户代码,原则上您在代码中执行引号)。
在您引用的具体示例中,您需要牢记:
换句话说,你减少10,000次计数器的任务是发生得如此之快的事情,以至于所有意图和目的,它几乎不会被注册为“可中断的任务”。实际上,要么所有10,000个减量都会在另一个线程有机会调用interrupt()之前发生,否则它们就不会发生。
答案 1 :(得分:1)
如果线程在等待,休眠或加入时被阻塞,则抛出InterruptedException,否则设置中断状态。
如果调用Thread.interrupted,则清除中断状态。
Thread.isInterrupted不会清除中断状态。
如果设置了线程的中断状态,并且该线程调用wait,sleep或join,则清除中断状态并抛出InterruptedExcepion。
答案 2 :(得分:0)
它只设置标志UNLESS当时正在执行可中断语句(例如,睡眠,等待)。现在你应该能够通过处理这两种情况来弄清楚如何停止线程。
如果线程被中断,我无法检查Thread.isInterrupted() 突破循环。我不能这样做。
为什么不呢?
E.g。
while(i<10000){
if(Thread.currentThread().isInterrupted()){
System.out.println("Thread Interrupted but it still running");
return; // HERE
}
System.out.println(++i);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
return; // HERE
}
}
答案 3 :(得分:0)
我怀疑是Thread.interrupt只设置了中断标志,否则它确实会停止执行。
它会做前者......或在某些情况下抛出“中断”的例外。
如何停止线程执行或终止正在运行的线程?
通常,您不能安全地停止或终止未检查其中断标志的正在运行的线程。 Thread
类上有一些已弃用的方法,但您应该避免使用它们,因为它们明显不安全。 (了解Thread方法javadocs的原因......以及它链接到的FAQ。)