java线程停止之interrupt

今天笔者学习了中断线程interrupt的方式,故在此分享下,话不多说直接上代码

public class InterruptDemo02 implements Runnable{
    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()){ //false
            try {
                TimeUnit.SECONDS.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
                //可以不做处理,
                //继续中断 ->
                Thread.currentThread().interrupt(); //再次中断
                //抛出异常。。
            }
        }
        System.out.println("processor End");
    }
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(new InterruptDemo02());
        t1.start();
        Thread.sleep(1000);
        t1.interrupt(); //有作用 true
        //Thread.interrupted() ;//复位
    }
}

看上诉代码,本文主要介绍下线程的interrupt()方法,线程调用isInterrupted()默认值为false,调用interrupt()后即把值设置为true,即可结束线程中的while循环。

interrupt()的作用

1、设置一个共享变量的值 true
2、唤醒处于阻塞状态下的线程。
针对第二点,使线程阻塞的方法sleep、wait、join都会抛出一个受检异常InterruptedException,这里的受检异常是在线程调用interrupt()方法时会进入catch,进入后会自动复原当前共享变量,即while循环还是不会结束,需要在catch中根据情况处理后续,如调用Thread.currentThread().interrupt();再次中断或者抛出异常中断当前线程等。

以下是另外一种基于volatile中断线程的方式

public class InterruptDemo03 implements Runnable{
    static volatile boolean interrupt=false;
    @Override
    public void run() {
        while(!interrupt){
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {
            Thread.class.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {
            Thread.currentThread().join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ;
    }
    public static void main(String[] args) {
        interrupt=true;
    }
}

java线程停止最直接的方法是stop(),但是stop不是线程正确停止的方式,因为stop会忽略线程当前的状态而强行停止线程

以上即是笔者分享的正确中断java线程的两种优雅的方式

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页