线程的终止
为什么不推荐stop
主要它不释放锁资源,尤其暴力终止,可能会导致业务执行到一半,出现各种问题。
为什么使用interrupt方法
通常使用自带的方法,而不是使用自定义的业务标识,是因为interrupt能修改线程状态,java线程的终止,需要从runnable终止。如果仅仅使用自定义的终止标志,有可能还需要等待java调度资源。
二阶段终止模式(最常用,且推荐)
首先,try-catch语句中,如果代码走入catch块,会导致jvm清除线程的终止状态,所以凡是使用线程执行的任务中需要异常机制的,catch块中都需要写this.interrupt()来重置终止标志位。
第二点、为什么要在异常中写终止,不在最后写终止来确保,a是为了提高执行效率,b是因为异常捕获之后,不让后续有依赖关系的程序连续抛出异常。
第三点,由于任务的执行中很可能调用第三方库,第三方库自己捕获的异常是不一定会重置终止标志位的,所以一般还是会写一个自定义的业务终止标志,用while来包裹业务逻辑,if判断自定义标志来终止任务。
以上三点综合就是 二阶段终止模式。
写一个常见业务逻辑代码案例吧
package com.wj.common.util; import org.junit.jupiter.api.Test; /** * @ClassName ThreadTerminateTest * @Description 测试 * @Date 2023/7/15 8:29 * @Version 1.0 **/ public class ThreadTerminateTest { @Test void testStop() { DemoThread demoThread = new DemoThread(); demoThread.start(); } public class DemoThread extends Thread { private boolean terminateFlg = false; @Override public void run() { doSomething(); } private void doSomething() { if(this.isInterrupted() || terminateFlg) { return; } while (!this.isInterrupted() || !terminateFlg) { try { System.out.println("做了第一件事"); int a = 1 / 0; } catch (Exception e) { terminateFlg = true; this.interrupt(); return; } System.out.println("做了第二件事"); terminateFlg = true; this.interrupt(); } } public void terminate() { terminateFlg = true; this.interrupt(); } } }