interrupt虽然是打断线程的方法,但不会立即结束线程运行,而是将线程的打断状态设置为true,在线程的isInterrupted方法来查看打断状态。
作用:打断线程。
1、打断处于阻塞状态的线程。
2、打断正在运行的线程。
注意:
1.当使用interrupt()方法去打断处于阻塞状态的线程时,会以异常的方式打印,而不会更新打断标记,因此,虽然被打断,但是打断标记依然为false。此时就需要在try catch异常捕获处再次调用interrupt()方法,就会使打断状态为true,优雅结束线程运行。
2.当使用interrupt()方法去打断正在运行线程时,被打断的线程会继续运行,但是该线程的打断标记会更新,更新为true,因此可以根据打断标记来作为判断条件使得线程停止。
1.打断 sleep,wait,join 的线程
打断 sleep 的线程, 会清空打断状态
sleep()、wait()、join()调用者三个方法可以使得线程阻塞,线程阻塞之后,cpu是不会分配时间片的
2.打断正常运行的线程
打断正常运行的线程, 不会清空打断状态
3.打断 park 线程
打断 park 线程, 不会清空打断状态。
// 暂停当前线程
LockSupport.park();
// 恢复某个线程的运行
LockSupport.unpark(暂停线程对象)
当线程在运行中,执行到park,此时线程暂停运行。
- park 中的线程,处于 WAIT 状态
- unpark 既可以在 park 之前调用或之后调用,都是用来恢复某个线程的运行,简单的说,调用 unpark 后再调用 park 线程依然不会暂停,类似提前“解毒”。
- 不论提前unpark多少次,只有第一次有效.
注意:如果打断标记已经是true,后续park将会失效
可以使用 Thread.interrupted() 清除打断状态。