wait()
wait是Object类中的一个方法,通常用于线程间的通信。- 线程调用wait方法时,它会释放持有的对象锁,并进入等待状态,直到其他线程调用相同对象的notify或notifyAll方法来唤醒它。
- 必须在同步块或者同步方法中使用,即必须持有对象的监视器锁。
- 在调用
wait方法时,线程必须拥有该对象的监视器锁,否则会抛出IllegalMonitorStateException。
也就是说在线程调用wait的时候,这个线程先是释放掉对象锁,然后进入等待状态。此时别的线程是可以竞争这个对象锁的。 当等待的线程被唤醒时(通过notify或notifyAll方法),它会尝试重新获取该对象的锁。如果锁已经被其他线程持有,唤醒的线程将继续等待,直到能够重新获得锁。
class WaitNotifyExample {
private static final Object lock = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread1 is waiting");
lock.wait(); // 进入等待状态并释放锁
System.out.println("Thread1 is resumed and got the lock");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock) {
System.out.println("Thread2 has the lock");
try {
Thread.sleep(2000); // 模拟一些处理
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread2 is notifying");
lock.notify(); // 唤醒等待的线程
try {
Thread.sleep(2000); // 保持锁一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread2 is releasing the lock");
}
});
thread1.start();
thread2.start();
}
}
sleep
sleep是Thread类中的一个静态方法,主要用于让当前线程暂停执行一段时间。- 线程调用
sleep方法时,会进入休眠状态,指定时间后自动恢复执行。 - 可以在任何地方使用,不需要持有任何锁。
总结
wait:用于线程间通信,必须在同步块中调用,会释放对象锁并等待唤醒。sleep:用于暂停当前线程指定时间,不需要同步块,不会释放锁。