sleep遇到中断后线程的状态问题
来源:5-4 遇到阻塞

大魔王kite
2021-08-23
我所理解的是:子线程在执行sleep()后会进入timed_waiting状态,子线程在timed_waiting状态下被中断后,子线程会抛出异常sleep interrupted,子线程会由timed_waiting变成terminated状态。
但是为什么实际的结果中,子线程的状态是Runnable状态 ,而不是timed_waiting ?
public class InterruptDemo {
public static void main(String[] args) throws InterruptedException {
Runnable interruptTask = new Runnable() {
@Override
public void run() {
int i = 0;
try {
while (!Thread.currentThread().isInterrupted()) {
Thread.sleep(200); // Timed_waiting状态
i++;
System.out.println(Thread.currentThread().getName() + " (" +
Thread.currentThread().getState() + ") loop " + i);
}
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + " (" +
Thread.currentThread().getState() + ") catch InterruptedException.");
}
}
};
Thread t1 = new Thread(interruptTask, "t1");
System.out.println(t1.getName() +" ("+t1.getState()+") is new.");
t1.start();
System.out.println(t1.getName() +" ("+t1.getState()+") is started.");
Thread.sleep(300);
t1.interrupt(); // 中断子线程
System.out.println(t1.getName() +" ("+t1.getState()+") is interrupted.");
Thread.sleep(300);
System.out.println(t1.getName() +" ("+t1.getState()+") is interrupted now.");
}
}
程序执行结果:
写回答
1回答
-
悟空
2021-08-23
因为那里是已经发生中断并且在执行
System.out.println
的代码了。
要想看到Timed_waiting状态,只能由别的线程去打印它的状态。
022021-08-23
相似问题