我创建了MyTask
,run()
内有3件事要做。我尝试interrupt()
保存MyTask
实例的线程。不幸的是,一旦它被中断,它就会结束,只有字符串First task
被打印在控制台上。
public class MyTask implements Runnable {
private volatile Thread thread;
@Override
public void run() {
while (!thread.isInterrupted()) {
System.out.println("First task");
}
while (!thread.isInterrupted()) {
System.out.println("Second task");
}
while (!thread.isInterrupted()) {
System.out.println("Third task");
}
}
public Thread start(){
thread = new Thread(this);
thread.start();
return thread;
}
public static void main(String[] args) throws InterruptedException {
Thread t = new MyTask().start();
Thread.sleep(1000);
t.interrupt();
Thread.sleep(1000);
t.interrupt();
Thread.sleep(1000);
t.interrupt();
}
}
如果我在Thread.sleep(10)
中添加run()
,则正常工作,并打印First task
,Second task
,最后{{1}在控制台上。
问题是:仅当我添加Third task
时,Whydoes Thread.interrupts()
才能正常工作?
sleep()
答案 0 :(得分:4)
引用Interrupts:
当线程通过调用静态方法Thread.interrupted检查中断时,中断状态被清除。非静态isInterrupted方法,一个线程用来查询另一个线程的中断状态,不会改变中断状态标志。
含义:将代码从thread.isInterrupted()
更改为Thread.interrupted()
,然后重试。
你的循环之间的sleep()
将立即清除该标志(立即抛出InterruptedException
(因为当前的线程已被中断)
答案 1 :(得分:0)
查看Thread.sleep(long)
抛出:InterruptedException - 如果有任何线程中断了当前线程。 抛出此异常时,将清除当前线程的中断状态。
因此,添加sleep
以及捕获(并加入)任何异常都将导致观察到的行为。
示例:
没有sleep()
:
interrupted = false
开头,因此第一个循环运行interrupted = true
interrupted
并且不再运行(再次)interrupted
并且不会全部运行interrupted
并且不会全部运行使用sleep()
interrupted = false
循环1:
interrupted = false
interrupted = true
interrupted = true
所以循环结束sleep()
,因为线程已被中断,所以抛出异常并再次interrupted = false
对循环2和3重复步骤2