Java 为什么可以先interrupt,后sleep ?
发布网友
发布时间:2022-05-15 07:41
我来回答
共3个回答
热心网友
时间:2023-08-15 08:17
因为interrupt在 java 内部实际上是设定了一个标志位叫 interrupt status ,可以中断任何阻塞状态,包括 sleep 在内,但是 interrupt 本身不会做什么主动的动作去恢复一个阻塞状态的线程,所以事情是这样的
在 interrupt 那行标记了重担标志
在 sleep 那行要阻塞的时候看到这个标志位后自己抛出了InterruptedException
不信你可以把 interrupt 那行从 try and catch 段中移到前面,你会发现不会抛任何异常直接走过去,然后到 sleep 才抛异常
理解了原理,就好想了
热心网友
时间:2023-08-15 08:17
public static void main(String s[]) {
sop("Start");
Thread t=Thread.currentThread();
try {
Thread.sleep(3000);
t.interrupt();
} catch (InterruptedException e) {
sop("Be interrupted~!!");
}
sop("OVER");
}
public static void sop(Object obj){ System.out.println(obj); }
这样应该才会停一会追问我的意思是:
interrupt应该是中断线程的阻塞状态,让他恢复运行。
但是,现在线程都没有被阻塞,就interrupt,那这个interrupt应该是无效的。
而实际上,他却有效?!
interruptinterrupt
就是说,我觉得运行效果应该是停3秒,而且不会触发异常。
但是,实际效果是没有停留,而且触发了异常!
追答你原来写的输出
Process started >>>StartBe interrupted~!!OVER<<< Process finished. (Exit code 0)
这明明中断线程了。
热心网友
时间:2023-08-15 08:18
即使先interrupt,也不可能中断,只有在sleep时,才能中断。