线程的终止

为什么不推荐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();
        }

    }
}

 

posted @ 2023-07-15 08:21  时间羚羊  阅读(4)  评论(0编辑  收藏  举报