为啥 thread.sleep 在第一次捕获时不停止?

Posted

技术标签:

【中文标题】为啥 thread.sleep 在第一次捕获时不停止?【英文标题】:why doesnt thread.sleep stop at the first catch?为什么 thread.sleep 在第一次捕获时不停止? 【发布时间】:2016-11-23 21:03:11 【问题描述】:
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 时,为什么它会继续运行?而不是退出。这是代码,当 for 循环第一次运行时,它会在遇到 thread.sleep 时打印“0”,因此会出现中断异常,它不应该去捕获并执行 S.O.P 并终止吗?

【问题讨论】:

嗯...您是否触发了导致sleep 终止的异常? 如果你不告诉它,你为什么会认为它会终止? 【参考方案1】:

为什么它一直在运行?

除非您告诉它,否则您的程序不会终止。它通常会继续运行。触发异常不会改变这一点。

【讨论】:

【参考方案2】:

仅调用 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。

【讨论】:

以上是关于为啥 thread.sleep 在第一次捕获时不停止?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Thread.Sleep 如此有害

如果 Task.Delay 优于 Thread.Sleep,为啥本书中的示例使用 Thread.Sleep?

Thread.sleep是啥意思?有啥作用

Thread.sleep(1)为啥不起作用?请高手帮忙分析!

为啥 Thread.sleep 不好用

为啥 Thread.Sleep 不在秒表中注册?