java线程如何挂起
线程挂起的基本方法
在Java中,线程挂起可以通过以下方式实现,但需注意线程挂起和恢复的操作可能引发死锁或资源竞争问题,需谨慎使用。
使用 wait() 和 notify()
wait() 方法使线程进入等待状态,直到其他线程调用 notify() 或 notifyAll() 唤醒它。需在同步块或同步方法中使用:
synchronized (lockObject) {
try {
lockObject.wait(); // 线程挂起
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
唤醒线程:
synchronized (lockObject) {
lockObject.notify(); // 唤醒一个等待线程
// 或 lockObject.notifyAll();
}
使用 Lock 和 Condition
java.util.concurrent.locks.Lock 提供了更灵活的线程挂起与唤醒机制:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
condition.await(); // 线程挂起
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
lock.unlock();
}
唤醒线程:
lock.lock();
try {
condition.signal(); // 唤醒一个等待线程
// 或 condition.signalAll();
} finally {
lock.unlock();
}
避免使用废弃方法
Thread.suspend() 和 Thread.resume() 已废弃,因其容易导致死锁(挂起时不释放锁)。
使用 sleep() 实现临时暂停
Thread.sleep() 使线程暂停指定时间,但不释放锁:

try {
Thread.sleep(1000); // 暂停1秒
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
注意事项
- 线程挂起需配合明确的唤醒机制,否则可能导致永久等待。
- 优先使用
wait()/notify()或Condition,而非废弃方法。 - 确保在同步代码块中调用
wait()或await(),避免IllegalMonitorStateException。 - 处理
InterruptedException时,通常恢复中断状态(Thread.currentThread().interrupt())。






