Java中断线程

Java并没有提供真正中断线程的方法,<font color=red>中断线程最好的方法就是让线程执行完成自然终止</font>,stop(),suspend(),resume()等方法会导致不安全或者死锁等问题,均已经废弃。

有两种方法中断线程,一种为通过自定义变量设置退出标志,一种通过interrupt方法,本质没有区别。<font color=red>但是第二种方式可以处理阻塞中的线程,推荐使用。</font>

第一种:通过自定义变量设置退出标志,让线程自然终止

public class ThreadFlag extends Thread {
    public boolean exit = false;

    public void run() {
        while (!exit) {
            System.out.println("我是子线程,我在执行");
        }
    }

    public static void main(String[] args) throws Exception {
        ThreadFlag thread = new ThreadFlag();
        thread.start();
        sleep(5000); // 主线程延迟5秒,看效果
        thread.exit = true;  // 终止线程thread 
        thread.join();
        System.out.println("线程退出!");
    }
}

这种开关的方式使用大部分情况,但是当遇到线程阻塞时,就没有办法了会一直卡在那,如下面的示例代码。

public class ThreadFlag extends Thread {
    public boolean exit = false;

    public void run() {
        while (!exit) {
            try {
                sleep(1000_000);//
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("我是子线程,我在执行");
        }
    }

    public static void main(String[] args) throws Exception {
        ThreadFlag thread = new ThreadFlag();
        thread.start();
        sleep(5000); // 主线程延迟5秒,看效果
        thread.exit = true;  // 终止线程thread
        thread.join();
        System.out.println("线程退出!");
    }
}

第二种:使用线程的interrupt方法

这种方法不会真正停止线程,需要自己根据interrupted标志自行处理让线程自然结束,相比于第一种方式有一个好处就是可以处理阻塞中的线程,它可以迅速中断被阻塞的线程,抛出一个InterruptedException,把线程从阻塞状态中释放出来,第一种则不行。

public class ThreadInterrupt extends Thread {

    public void run() {
        while (!isInterrupted()) {//判断结束标志
            try {
                sleep(1000_000);//
            } catch (InterruptedException e) {
                e.printStackTrace();
                return;
            }
            System.out.println("我是子线程,我在执行");
        }
    }

    public static void main(String[] args) throws Exception {
        ThreadInterrupt thread = new ThreadInterrupt();
        thread.start();
        sleep(5000); // 主线程延迟5秒,看效果
        thread.interrupt();
        thread.join();
        System.out.println("线程退出!");
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容