如何正确的挂起一个线程(为什么suspend被弃用)

本文介绍了在JDK1.5中被弃用的suspend方法可能导致的线程死锁问题,并提供了一种安全地挂起和恢复线程的替代方案。通过引入suspendRequested标志和条件变量,可以避免线程间的死锁。

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

suspend在JDK1.5时被弃用,因为它经常导致线程死锁。suspend不会破坏对象,但是如果用suspend挂起一个持有一个锁的线程,那么该锁在恢复之前是不可以使用的,如果调用suspend方法的线程试图获得同一个锁,那么会发生什么呢?没错,线程死锁!!被挂起的线程等待恢复,将其挂起的线程等待得到这把锁。
如何正确的得挂起一个线程?

//引入一个变量suspendRequested并在run方法安全的地方测试它
//安全的地方就是指该线程没有封锁其它线程需要的对象的地方
public volatile boolean suspendRequested = false; 
private Lock suspendLock = new ReentrantLock(); 
private Condition suspendCondition = suspendLock.newCondition(); 
public void run() { 
    while (true) { 
        ..........

        if (suspendRequested) { //如果需要挂起,即suspendRequested=true
                suspendLock.lock(); //得到对象锁
        try { 
            while (suspendRequested) 
                suspendCondition.await(); //保持等待状态,放弃得到的锁,等待重新得到锁,得以获得CPU时间
            } catch (Exception e) {

             } finally { 
                 suspendLock.unlock();//释放刚刚得到的锁
            } 
        } 
    } 
public void requestSuspend() { 
        suspendRequested = true;//需要挂起线程时调用这个方法
     }
public void requestResume{//需要重新恢复那个挂起的线程
         suspendRequested = false; //让挂起的状态=false
        suspendLock.lock(); //申请得到对象锁
        try { 
            suspendCondition.signalAll(); //唤醒被挂起的线程
        } catch (Exception e) { 
            e.printStackTrace();
         } 
            finally{
                 suspendLock.unlock(); //释放得到的锁,让被挂起的线程得到锁,
         }
     }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值