java - 以下代码中主线程 sleep /中断的工作方式

标签 java multithreading sleep interrupt

第二个循环实际上如何中断正在 hibernate 的主线程,而第一个则不?
我的理解是在Thread.sleep(3000)之后,代码Thread.currentThread()。interrupt()将在3秒后执行。
谁能解释一下它实际上是如何工作的

for (int i = 0; i < 2; i++) {
            try {
                System.out.println("loop : " + i);
                Thread.sleep(3000);
                System.out.println("Woke up");
                Thread.currentThread().interrupt();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
loop : 0
Woke up
loop : 1
java.lang.InterruptedException: sleep interrupted
exception loop:1
    at java.base/java.lang.Thread.sleep(Native Method)
    at multithreadings.Mainclass.main(Mainclass.java:13)

最佳答案

中断是有礼貌的停止请求:线程没有义务停止。

就像罗宾·威廉姆斯(Robin Williams)关于what police in the UK say when you commit a crime的笑话一样:

Stop! Or I'll say stop again!



同样,中断线程不会导致抛出InterruptedException:它只是在线程上设置一个标志。如果某些东西(例如Thread.sleep)检查了此标志并发现它已设置,则可能会抛出InterruptedException;但是标志和异常是指示中断的两种正交方式。

因此:
  • 第一次执行时,您 sleep 3秒钟,然后设置中断标志,并且循环主体正常完成。
  • 在第二次执行时,您要求 sleep 3秒,但是Thread.sleep检测到中断的标志并引发异常。
  • 关于java - 以下代码中主线程 sleep /中断的工作方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57464818/

    相关文章:

    Java英文日期格式解析

    java - JSF 2 - 如何将 Ajax 监听器方法添加到复合组件接口(interface)?

    java - 如何区分客户端请求返回我的 REST Web 服务的格式?

    java - 无法从 Dropbox 下载文件

    Java 线程挂起不起作用

    ios - 更新按钮 UIImage 而计数器减少 iOS

    c - 时间逼近算法?

    java - 非法访问: this web application instance has been stopped already

    android - 如何标准化不同手机中线程的速度(帧率)

    ios - 如何在我的网站中关闭自动 sleep ios