多线程编程艺术(2)-安全的终止线程

本文探讨了线程管理中的suspend()、resume()和stop()方法的使用风险及替代方案,强调了通过标识位或中断操作优雅终止线程的重要性。通过示例代码展示了一种更为安全的方法来控制线程生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文内容来源于《多线程编程艺术》一书,本人阅读过程的总结

suspend()、resume()和stop()方法可以完成了线程的暂停、恢复和终止工作,而且非常“人性化”。但是这些API是过期的,也就是不建议使用的。不建议使用的原因主要有:以suspend()方法为例,在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易引发死锁问题。同样,stop()方法在终结一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。
正因为suspend()、resume()和stop()方法带来的副作用,这些方法才被标注为不建议使用的过期方法,而暂停和恢复操作可以用后面提到的等待/通知机制来替代。

可以利用一个boolean变量来控制是否需要停止任务并终止该线程。
代码实例如下:
    public static void main(String[] args) throws Exception{
        Runner one = new Runner();        
        Thread countThread = new Thread(one, "CountThread");        
        countThread.start();        // 睡眠1秒,main线程对CountThread进行中断,使CountThread能够感知中断而结束       
        TimeUnit.SECONDS.sleep(1);        
        countThread.interrupt();        
        Runner two = new Runner();        
        countThread = new Thread(two, "CountThread");
        countThread.start();        // 睡眠1秒,main线程对Runner two进行取消,使CountThread能够感知on为false而结束        
        TimeUnit.SECONDS.sleep(1);        
        two.cancel();

    }

    private static class Runner implements Runnable{
        private long i ;
        private volatile boolean on =true;
        @Override
        public void run() {
            while(on && !Thread.currentThread().isInterrupted()){
                i++;
            }
            System.out.println(i);
        }

        public void cancel(){
            on =false;
        }

    }

通过标识位或者中断操作的方式能够使线程在终止时有机会去清理资源,而不是武断地将线程停止,因此这种终止线程的做法显得更加安全和优雅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值