为什么Thread中断方法没有打破睡眠方法?

时间:2014-10-01 15:11:23

标签: multithreading

我在下面有这个程序

package com;
public class ThreadDemo implements Runnable {
    @Override
    public void run() {
        while(true)
        {
            try {
                System.out.println("Into sleep");
                Thread.sleep(1000000000);
                System.out.println("Out of sleep");
                } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public static void main(String args[]) {
        ThreadDemo tD = new ThreadDemo();
        Thread t1 = new Thread(tD);
        t1.start();
        t1.interrupt();
    }
}

我已启动Thread,并将调用其run方法并进入上述指定秒数的休眠状态。

我致电t1.interrupt();

这是截屏

enter image description here

我的问题是为什么

1.线程是否未进入睡眠状态?

  1. 为什么Into sleep被打印两次?

2 个答案:

答案 0 :(得分:4)

你在循环中:

  • 你正在睡觉
  • 被打断并打印堆栈跟踪
  • 回去睡觉
  • 再也不会被打断

所以 "退出睡眠状态" (否则你不会看到堆栈跟踪) - 但是你再次调用Thread.sleep

如果你只想睡一次,摆脱循环......

答案 1 :(得分:1)

1.线程是否已退出睡眠状态?

他实际上只是

System.out.println("Out of sleep");
永远不会执行

,因为当你中断Thread.sleep(10000)时;抛出异常并

e.printStackTrace();

执行