public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
while (true) {
if (Thread.currentThread().isInter
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
rupted()) {
System.out.println(“Interrupt!”);
break;
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println(“Interrupted When Sleep”);
Thread.currentThread().interrupt();
}
Thread.yield();
}
});
t1.start();
Thread.sleep(1000);
t1.interrupt();
}
-
如果在sleep的时候,线程被中断,则程序会抛出异常,并进入异常处理。在catch字句里,由于已经捕获了中断,我们可以立即退出线程,但是并没有这么做。因为**也许在这段代码中,还必须进行后续的处理,保障数据的一致性和完整性。**因此,执行了interrupt()方法再次中断自己,置上中断标志位。只有这么做,在检查isInterrupted(),才能发现当前线程已经被中断了。可以试一下将catch的interrupt注释掉进行验证。
-
Thread.sleep()方法由于中断而抛出异常,此时,它会清除中断标记,如果不加处理,那么在下一次循环开始时,就无法不会这个中断,所以在异常处理中,再次设置中断标志位。
-
等待(wait)和通知(notify)
===================
-
wait和notify不是在Thread类中的方法,而是在Object类中,意味着任何对象都能调用这两个方法。
-
如果一个线程调用了wait()方法,那么它就会计入object对象的等待队列。这个等待队列中,可能会有多个线程,因为系统运行多个线程同时等待同一个对象。当notify()被调用是,它就会从这个等待队列中,随机选择一个线程,并将其唤醒。但是这个选择不是公平的,并不是先等待的线程会优先被选择,这个选择完全是随机的。
-
notifyAll()方法会唤醒这个等待队列的所有线程。
-
无论是wait()或者是notify()方法,必须包含在对应的synchronized语句中,无论是wait()或者notify()都需要首先获取目标对象的一个监视器。
-
而wait()方法执行后,会释放这个监视器,当被重新notify()后&#x