java 终止线程的4种方式

一、使用布尔标志位

        在线程的执行代码中,使用一个布尔类型的标志位来标识线程是否需要终止。线程在执行过程中,不断地检查这个标志位,如果标志位为true,则主动退出线程执行的循环或方法,从而终止线程的执行。

public class MyThread implements Runnable {
    private volatile boolean flag = true;

    public void run() {
        while (flag) {
            // 执行线程任务
        }
    }

    public void stopThread() {
        flag = false;
    }
}

二、使用interrupt()方法

        每个线程对象都有一个interrupt()方法。通过调用该方法,可以将线程的中断状态设置为"中断"。在线程的执行代码中,在适当的位置使用Thread.currentThread().isInterrupted()方法来检查线程的中断状态,并在必要时终止线程的执行

public class MyThread extends Thread {
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            // 执行线程任务
        }
    }
    
    public void stopThread() {
        interrupt();
    }
}

三、使用stop()方法(已过时)

        Thread类提供了stop()方法,可以立即终止线程的执行。但是该方法已过时,不推荐使用。因为stop()方法可能导致线程不会释放占用的锁资源,从而引发线程安全问题。

public class MyThread extends Thread {
    public void run() {
        while (true) {
            // 执行线程任务
        }
    }
    
    public void stopThread() {
        stop();
    }
}

四、使用Thread.interrupt()方法配合isInterrupted()方法

        线程的interrupt()方法会将线程的中断状态设置为"中断"。在线程的执行代码中,可以使用Thread.currentThread().isInterrupted()方法检查线程的中断状态,并在必要时终止线程执行。与方式2相比,这种方式更加灵活,可以处理更复杂的线程终止逻辑。

public class MyThread extends Thread {
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                // 执行线程任务
                // 可能会有一些阻塞操作,如Thread.sleep()等
            } catch (InterruptedException e) {
                // 捕获InterruptedException异常,清除中断状态
                Thread.currentThread().interrupt();
            }
        }
    }
    
    public void stopThread() {
        interrupt();
    }
}