您的位置:

Java中如何停止线程

一、使用flag停止线程

在Java中,可以通过设置flag的方式来停止线程。flag是一个标志位,通常设置成volatile类型的变量,可以实现不同线程的可见性。设置flag的方式也是最基本的方式。代码如下:

class MyThread extends Thread {
    private volatile boolean flag = true; //设置成volatile类型
    
    @Override
    public void run() {
        while (flag) { //通过flag控制循环条件
            //线程执行的任务
        }
    }
    
    public void stopThread() {
        flag = false;
    }
}

上述代码中,MyThread实现了Thread的run方法。其中run方法通过while(flag)控制线程是否继续执行任务。flag默认为true,在stopThread方法中将flag设置为false即可停止线程。

二、使用interrupt停止线程

除了flag的方式,Java中还提供了interrupt的方式来停止线程。interrupt更加灵活,可以在特定的情况下停止线程,而不是强制性地停止。代码如下:

class MyThread extends Thread {
    @Override
    public void run() {
        while (!isInterrupted()) { //通过isInterrupted()控制循环条件
            //线程执行的任务
        }
    }
    
    public void stopThread() {
        interrupt(); //调用interrupt方法
    }
}

上述代码中,MyThread同样实现了Thread的run方法。其中run方法通过!isInterrupted()控制线程是否继续执行任务。isInterrupted默认为false,在stopThread方法中调用interrupt()方法即可停止线程。

三、使用stop停止线程(不推荐)

在早期的版本中,Java提供了stop方法来强制停止线程。但是,由于stop方法可能会导致线程资源未释放,因此stop方法已经被Deprecated。不建议使用stop方法。如果必须使用,也请注意相关的注意事项。

class MyThread extends Thread {
    @Override
    public void run() {
        while (true) { //无限循环
            //线程执行的任务
        }
    }
    
    public void stopThread() {
        stop(); //调用stop方法
    }
}

四、使用Thread.interrupted()判断线程是否被中断

使用interrupt方式中,需要通过代码来判断线程是否被中断,以控制线程的执行。可以使用Thread类中的interrupted()或isInterrupted()方法判断。代码如下:

class MyThread extends Thread {
    @Override
    public void run() {
        while (!Thread.interrupted()) { //通过Thread.interrupted()控制循环条件
            //线程执行的任务
        }
    }
    
    public void stopThread() {
        interrupt(); //调用interrupt方法
    }
}

在上述代码中,run方法中的while(!Thread.interrupted())与while(!isInterrupted())相同,Thread.interrupted()方法是一个静态方法,可以返回当前线程是否被中断。调用interrupt方法可中断线程。

五、小结

本文介绍了Java中如何停止线程,并详细说明了多种方式的实现方法及注意事项。通常情况下,flag和interrupt是比较合适的方式。stop方法虽然方便,但是不建议使用,有可能导致线程资源未释放。