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