我正在玩以下示例:
public static void interrupted() throws InterruptedException {
Runnable task = () -> {
while(true && !Thread.currentThread().isInterrupted()) {
System.out.println("task executing");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Thread thread = new Thread(task);
thread.start();
//lets allow spawned thread to run by sleeping main thread for 10 seconds
Thread.currentThread().sleep(10000);
thread.interrupt();
}
当我运行此方法时,我期待:
1 通过 Runnable 启动的任务将运行几次并打印 SOP
上面的 2 是可能的,因为主线程休眠了 10 秒
3 一旦主线程唤醒,它就会调用衍生线程的中断
4 在 Runnable 任务中,我们正在检查 isInterrupted,因此它应该被触发并且生成的线程应该退出,从而允许 JVM 退出。
然而,这并没有发生,eclipse/jvm 显示生成的线程仍在运行 while 循环
这是控制台:
task executing
task executing
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at basics.StopEx.lambda$1(StopEx.java:39)
at java.lang.Thread.run(Thread.java:748)
task executing
task executing
task executing
task executing
........
关于中断的 java 文档似乎表明调用“睡眠”会导致不同的行为(下面突出显示)-有人可以阐明这里到底发生了什么以及为什么吗?
中断此线程。
除非当前线程正在中断自身(这始终是允许的),否则将调用此线程的 checkAccess 方法,这可能会导致抛出 SecurityException。
如果此线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法或 join()、join(long)、join(long, int) 方法时被阻塞, sleep(long), or sleep(long, int), 这个类的方法,然后它的中断状态将被清除,它会收到一个 InterruptedException。
如果此线程在 InterruptibleChannel 上的 I/O 操作中被阻塞,则通道将关闭,线程的中断状态将被设置,线程将收到 java.nio.channels.ClosedByInterruptException。
如果此线程在 java.nio.channels.Selector 中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能返回一个非零值,就像选择器的唤醒方法被调用一样。
如果前面的条件都不成立,那么将设置该线程的中断状态。
中断一个不活动的线程不需要有任何影响。
萧十郎
紫衣仙女
人到中年有点甜
相关分类