介绍
我们先思考一下,如果 一个线程正在运行中,我们如何 把该正在运行的线程终止运行,我们可以看到 在 线程api中 有 stop方法,或者 system的exit 方法,但是 这种 直接 终止的行为 不够优雅,而且太暴力,假如 有一个线程 再打断后 还需要 做一些 处理逻辑的话 ,那么用stop,或者 exit 方法 就不太合适了
就好像 我们 工作中 离职一样,我们是 直接被开除,什么都不管当天就走,还是 自己 开除的时候 办一些手续,显然被开除不太好 ,但是相对来说还是第二个 更加合理且负责一点
api
interrupt 字面意思打断,当我们 一个线程a 在运行过程中,我们运行线程a的该interrupt方法 可以 把 把正在 wait,sleep,或者 正在运行中的线程打断 ,但是 假如 线程a 正在 wait,sleep 的时候 被打断,这时候 会爆出打断异常并且重置打断条件,而正在运行中的线程被打断,则不会爆出异常并且 修改打断标记 为true
api代码
我们直接上代码观察结果,可以看到 直接爆出异常
而没有执行 wait 或者sleep的线程被打断 不会报出错误
我们可以看到 怎么 有一个 isInterrupted 方法, 这个就是 记录 打断的状态,如果 该线程调用过了 interrupt方法,那么 该 is 方法 就会 变为 true ,否则为false
两阶段终止
两段终止就是 根据 isinterrupted 的 条件 用循环重置,来进行两端终止的判断
运行结果为
该种线程结束的形式,就是让线程拥有处理后事的能力,而 我们在线程中 是怎么判断 这个打断标记呢? 就是 thread里面的一个成员变量
打断方法 会把该成员变量的状态变换成 true; 默认的是false;