为什么thread.sleep在第一次捕获时没有停止?

时间:2016-07-20 14:44:03

标签: java interrupted-exception

public static void main(String s[])
{
    Thread t=Thread.currentThread();
    t.setName("main");
    try
    {
        for(int i=0;i<=5;i++)
        {
            System.out.println(i);
            Thread.sleep(1000);//interrupted exception(System provides error on its own) 
        }
    }
    catch(InterruptedException e)
    {
        System.out.println("main thread interrupted");
    }
}

`在我的理解中,当存在异常条件时,控件转到catch,实现它并离开代码。当我们使用thread.sleep并为interruptedException创建一个catch时,为什么它继续运行?而不是放弃。这是代码,当第一次循环运行时,它会在遇到thread.sleep时打印“0”因此是一个interrupttedexception,它不应该捕获并执行S.O.P并终止?

2 个答案:

答案 0 :(得分:0)

  

为什么它一直在运行?

除非您告知,否则您的计划不会终止。它通常继续运行。触发异常不会改变它。

答案 1 :(得分:0)

调用Thread.sleep不会触发InterruptedException。对于此代码抛出InterruptedException,必须在线程上调用中断。将代码更改为

public class MainInterruptingItself {

    public static void main(String s[]) {
        Thread.currentThread().interrupt();
        try {
            for(int i=0;i<=5;i++) {
                System.out.println(i);
                Thread.sleep(1000);
            }
        }
        catch(InterruptedException e) {
                System.out.println("main thread interrupted");
        }
    }
}

它会打印出来

0
main thread interrupted

这里发生的是调用中断设置线程上的中断标志。当Thread.sleep执行时,它会看到设置了中断标志,并根据它抛出了InterruptedException。