线程的中断:Interrupt
当调用Thread.interrupt()方法时,它实际上是对目标线程设置了一个中断标志位(中断位)。这个操作本身并不会直接停止线程的执行。
线程只有在主动检查中断标志时才会知道自己被中断了。常见的检查方法有两种:
-
Thread.interrupted():这是一个静态方法,它会检查当前线程的中断状态,并在检查后清除中断标志。
-
isInterrupted():这是一个实例方法,它只检查线程的中断状态,不会清除中断标志。
对于一些阻塞方法(如sleep、wait、join等),当线程在执行这些方法时被中断,这些方法会抛出InterruptedException异常,并且在抛出异常时会自动清除中断标志。这就意味着如果希望在这些方法被中断后,线程还能继续处理中断相关事宜,可能需要在catch块中重新设置中断标志(如Thread.currentThread().interrupt())。
综上所述,Thread.interrupt() 只是设置线程的中断标志,线程是否响应中断取决于线程自身是否检查了中断标志,以及如何处理检查到的中断情况。
使用 sleep(),wait(),join()时,必须都使用 try-catch 中包裹
使用 wait() 需要在同步代码块(Synchronized修饰的)中,sleep() 和 join() 不需要