多线程之(中断线程)

线程中断

线程中断是门技术活,是我们控制线程死亡的手法。用的好,可以节约资源。当线程满足我们的需求后,想办法中断掉,就可以释放该线程占用的资源,也是一门艺术。Java之前有给我们提供,直接杀死线程的方法,但是过于危险,已经废弃了,不建议使用。但是问题的解决方案永远不止一种。这次,我们来说三种线程中断的解决方案。

第一种,代码控制。

我们自己可以设定一个Boolean(布尔)类型的成员变量,通过true和false。当然这种方法可以自由发挥。
回到代码层面

package cn.zl.stop;
public class StopThread implements Runnable {
    // 线程结束的标记
    private boolean flag = false;
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("线程正在执行 " + i);
            if (flag){
                System.out.println("中断线程");
                // 直接return掉。让run方法结束执行
                return;
            }
        }
    }
}

测试代码

package cn.zl.stop;
public class ThreadMain {
    public static void main(String[] args) throws InterruptedException {
        StopThread stopThread = new StopThread();
        Thread thread = new Thread(stopThread);
        thread.start();
        // 让主线程休眠一下,给线程启动提供时间。
        Thread.sleep(2);
        stopThread.setFlag(true);
    }
}

第二种直接,调用stop方法杀死线程。

这种方法,已经被抛弃了,但是也算是一种中断线程的方法。
回到代码层面

package cn.zl.stop;
public class ThreadMain {
    public static void main(String[] args) throws InterruptedException {
        StopThread stopThread = new StopThread();
        Thread thread = new Thread(stopThread);
        thread.start();
        // 让主线程休眠一下,给线程启动提供时间。
        Thread.sleep(2);
        thread.stop();
    }
}

第三种,使用线程内置的中断标识。

线程内置了一个中断标识,Interrupt。我们可以通过调用这个API,去中断我们的线程。这里分为两种场景,一种是线程处于非休眠状态,另一种是线程处于休眠状态。
回代码层面
线程处于非休眠状态

package cn.zl.stop;
public class StopThread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("线程正在执行 " + i);
            // 获取当前线程的中断标识
            boolean interrupted = Thread.currentThread().isInterrupted();
            if (interrupted){
                System.out.println("中断线程");
                // 直接return掉。让run方法结束执行
                return;
            }
        }
    }
}

测试一下

package cn.zl.stop;
public class ThreadMain {
    public static void main(String[] args) throws InterruptedException {
        StopThread stopThread = new StopThread();
        Thread thread = new Thread(stopThread);
        thread.start();
        // 让主线程休眠一下,给线程启动提供时间。
        Thread.sleep(2);
       // 提醒线程中断
        thread.interrupt();
    }
}

线程处于休眠状态

package cn.zl.stop;

public class StopThread implements Runnable {

    @Override
    public void run() {
        try {
            // 让线程处于休眠的状态
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 获取当前线程的中断标识
            boolean interrupted = Thread.currentThread().isInterrupted();
            if (interrupted){
                System.out.println("中断线程");
                // 直接return掉。让run方法结束执行
                return;
            }
    }
}

测试一下

package cn.zl.stop;

public class ThreadMain {
    public static void main(String[] args) throws InterruptedException {
        StopThread stopThread = new StopThread();
        Thread thread = new Thread(stopThread);
        thread.start();
        // 让主线程休眠一下,给线程启动提供时间。
        Thread.sleep(2);
        // 抛出线程停止的信号
        thread.interrupt();
    }
}

执行结果


image.png

你可能感兴趣的:(多线程之(中断线程))