多线程系列——优雅关闭线程

    多线程有三种关闭方式: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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值