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

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(); //释放得到的锁,让被挂起的线程得到锁,
         }
     }
 }

你可能感兴趣的:(java基础)