面试官问:如何优雅的停止一个线程?

本文探讨了如何在Java中优雅地停止线程,包括使用`interrupt`方法和`volatile`标记位。文章强调了线程安全的重要性,指出`interrupt`仅提供中断通知,而被停止线程有权决定何时停止。同时,文章通过实例展示了在某些场景下`volatile`修饰的标记位无法有效停止阻塞线程,推荐在适当场景使用`interrupt`。
摘要由CSDN通过智能技术生成

如果面试有人问你 “如何优雅的停止一个线程?”, 你该如何去回答尼 ?能不能完美的回答呢?

对于线程的停止,通常情况下我们是不会去手动去停止的,而是等待线程自然运行至结束停止,但是在我们实际开发中,会有很多情况中我们是需要提前去手动来停止线程,比如程序中出现异常错误,比如使用者关闭程序等情况中。在这些场景下如果不能很好地停止线程那么就会导致各种问题,所以正确的停止程序是非常的重要的。

强行停止线程会怎样?

在我们平时的开发中我们很多时候都不会注意线程是否是健壮的,是否能优雅的停止,很多情况下都是贸然的强制停止正在运行的线程,这样可能会造成一些安全问题,为了避免造成这种损失,我们应该给与线程适当的时间来处理完当前线程的收尾工作, 而不至于影响我们的业务。

对于 Java 而言,最正确的停止线程的方式是使用 interrupt。但 interrupt仅仅起到通知被停止线程的作用。而对于被停止的线程而言,它拥有完全的自主权,它既可以选择立即停止,也可以选择一段时间后停止,也可以选择压根不停止。可能很多同学会疑惑,既然这样那这个存在的意义有什么呢,其实对于 Java 而言,期望程序之间是能够相互通知、协作的管理线程。

比如我们有线程在进行 io 操作时,当程序正在进行写文件操作,这时候接收到终止线程的信号,那么它不会立马停止,它会根据自身业务来判断该如何处理,是将整个文件写入成功后在停止还是不停止等都取决于被通知线程的处理。如果这里立马终止线程就可能造成数据的不完整性,这是我们业务所不希望的结果。

interrupt 停止线程

关于 interrupt 的使用我们不在这里过多阐述,其核心就是通过调用线程的 isInterrupt() 方法进而判断中断信号,当线程检测到为 true 时则说明接收到终止信号,此时我们需要做相应的处理。

我们编写一个简单例子来看

public static void main(String[] args) {
    Thread thread = new Thread(() -> {
      while (true) {
        //判断当前线程是否中断
        if (Thread.currentThread().isInterrupted()) {
          System.out.println("线程1 接收到中断信息,中断线程...中断标记:" + Thread.currentThread().isInterrupted());
          //跳出循环,结束线程
          break;
        }
        System.out.println(Thread.currentThread().getName() + "线程正在执行...");


      }
    }, "interrupt-1");
    //启动线程 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿码天地

相互学习,谢谢您的打赏。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值