优雅关闭线程

    多线程有三种关闭方式:1、通过while(flag){}的flag来判断(感觉像是废话)。2、通过stop来关闭。3、线程中所有逻辑执行完,自然结束(感觉也像是废话)。通过while循环的开关来关闭以及线程自然结束大家都知道,我们这里说一下stop。
    大家都知道现在的jdk版本中stop方法已经不建议使用了还有什么必要说呢,同时大家也可能会问interrupt难道不能关闭线程嘛,我们下面来一个例子:

public class ThreadTest {

    public static int a;
    public static int b;

    public static void main(String[] args) throws InterruptedException {
//        test1();
        test2();
    }

    private static void test2() throws InterruptedException {

        Thread myThread = new Thread(()->{
            synchronized (ThreadTest.class) {
                a++;
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                b++;
            }
        });
        myThread.start();
        Thread.sleep(1000);
        myThread.interrupt();
//        myThread.stop();
        System.out.println("线程是否停止:"+myThread.isInterrupted());
        Thread.sleep(5000);
        System.out.println("a="+a);
        System.out.println("线程是否停止:"+myThread.isInterrupted());
        System.out.println("b="+b);
        System.out.println("线程是否停止:"+myThread.isInterrupted());
    }

}

    如果使用interrupt,最终的打印是a=1,b=1,而使用stop则是a=1,b=0,可以看出stop将synchronized包围的原子块给破坏了,也就是原本的代码不管三七二十一,一旦执行stop就会停止,看上去很雷厉风行,其实是很不优雅的,你想原本一段加锁代码,而你stop,活生生的将一原子操作在中间给停止了,这是有危险性的,容易带来线程不安全。我们再来看interrupt,可以很清晰的看到,interrupt并没有关闭线程,也没有破坏原子操作,而是让线程顺利执行结束了,所以interrupt是不具备关闭线程的能力的。
    那么interrupt不能关闭线程,stop能关闭但不优雅,那线程怎么关闭:(1)while(flag),(2)让线程逻辑走到最后。如果你不想让程序走完所有呢,提前return,就到最后了呀。你可能会问那要interrupt有何用,interrupt用处大着了,他虽然不可以关闭线程,但可以打断阻塞,让线程继续执行,当线程处在wait,sleep,或者被其他东西阻塞时,interrupt是可以跳出阻塞,让线程状态重新变回RUNNABLE的。

那interrupt怎么实现关闭线程呢?方法:

        Thread thread = new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){
                …………………………
            }
        });
        
        thread.start();
        //主线程中调用interrupt
        thread.interrupt();
发布了39 篇原创文章 · 获赞 9 · 访问量 1002

猜你喜欢

转载自blog.csdn.net/qq_30095631/article/details/103795930
今日推荐