如何优雅地停止一个线程?

本文介绍了如何在Java中优雅地停止线程,讨论了stop()方法的不安全性,并详细阐述了使用interrupt()方法配合标志位来控制线程终止的过程。通过示例代码展示了如何处理中断异常,确保线程在适当条件下能够正确结束。
摘要由CSDN通过智能技术生成

线程终止有两种情况:

  1. 线程的任务执行完成
  2. 线程在执行任务过程中发生异常

这两者属于线程自行终止,如何让线程 A 把线程 B 终止呢?

Java 中 Thread 类有一个 stop() 方法,可以终止线程,不过这个方法会让线程直接终止,在执行的任务立即终止,未执行的任务无法反馈,所以 stop() 方法已经不建议使用。

既然 stop() 方法如此粗暴,不建议使用,我们如何优雅地结束线程呢?

线程只有从 runnable 状态(可运行/运行状态) 才能进入terminated 状态(终止状态),如果线程处于 blocked、waiting、timed_waiting 状态(休眠状态),就需要通过 Thread 类的 interrupt() 方法,让线程从休眠状态进入 runnable 状态,从而结束线程。

当线程进入 runnable 状态之后,通过设置一个标识位,线程在合适的时机,检查该标识位,发现符合终止条件,自动退出 run () 方法,线程终止。

如我们模拟一个系统监控任务线程,代码如下

/**
 * 模拟系统监控
 */
public class TestSystemMonitor {
   
    
    public static void main(String[] args) {
   
        testSystemMonitor();//测试系统监控器
    }
    /**
     * 测试系统监控器
     */
    public static void testSystemMonitor() {
   
        SystemMonitor sm = new SystemMonitor();
        sm.start();
        try {
   
            //运行 10 秒后停止监控
            Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
        System.out.println("监控任务启动 10 秒后,停止...");
        sm.stop();
    }
    
}
/**
 * 系统监控器
 */
class SystemMonitor {
   
    
    private Thread t;
    /**
     * 启动一个线程监控系统
     */
    void start() {
   
        t = new Thread(() -> {
   
            while (!Thread.currentThread().isInterrupted()) {
   //判断当前线程是否被打断
                System.out.println("正在监控系统...");
                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值