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状态,只能由别的线程去打印它的状态。

0
2
悟空
回复
大魔王kite
是对的
2021-08-23
共2条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程