5.中断线程的正确使用方式--》两阶段终止模式讲解

综述:说到中断线程,我们java中提供了一个stop方法,不过已经不建议使用了,因为stop方法一剑封喉,线程来不及料理后事

1.两阶段终止模式讲解

1)简述:俩阶段模式分成俩个阶段,一个是线程T1向T2发送终止指令,一个是T2响应终止指令

俩阶段终止模式示意图

2)终止指令:我们java中线程要想处于终止状态只能从Runable状态到终止状态,所以终止指令第一个要做的就是让线程初于Runnable状态,这个步骤是通过interrupt方法完成。那在此基础上,线程如何终止呢?我们优雅的终止方式是让线程执行完run方法,然后在合适的时机设一个中断标识位进行中断!所以终止指令包含interrupt方法和中断标识!

2.终止线程

1)代码演示

线程中断

这个地方我们通过调用interrupt方法让线程处于runnable状态(并且设置一个中断标识表示可以中断),在run方法中判断线程的中断标识位(这里的标识位是线程的中断状态),来中断线程,但是如果出现异常,jvm会清除中断状态,所以我们在catch方法中重新设置中断状态!这里有一个缺点,就是如果调用第三方的类库,没有正确处理线程的中断异常,例如第三方类库在捕获到Thread.sleep()方法抛出的中断异常后,没有重新设置线程的中断状态,那么就会导致线程不能够正常终止。所以这里建议使用自己的中断标识!如下所示

线程中断

2)注意点:其实我们正常情况是觉得这个volatile在这里没有这个必要,因为synchronized保证原子性的同时,也能间接的保证可见性(happens-before原则),但问题是start方法里又启动了一个新的线程,synchronized管不到这个新的线程!所以我们这里volatile一定要加,保证可见性

3.线程池的关闭方式

主要是通过俩个方法,一个shutdown,一个shutdownNow!shutdown是一种很保守的方式,执行这个方法之后,线程池就会拒绝接受新的任务,但是会把当前线程池中的任务执行结束!而shutdownNow则是不仅拒绝任务,还会中断当前线程池中正在执行的任务,不过这些被剥夺执行机会的任务会作为shutDownNow()方法的返回值返回。其实从本质上讲,这俩个方法也是用的俩阶段终止模式,只是终止指令的范围不同,前者只影响阻塞队列接受任务,后者扩大到线程池中所有的任务

4. 应用场景 --》监控操作

你可能感兴趣的:(5.中断线程的正确使用方式--》两阶段终止模式讲解)