Appearance
wait()和sleep()的区别?
所属类:
wait()
是定义在Object
类中的方法sleep()
是定义在Thread
类中的方法
唤醒机制:
wait()
需要通过调用同一个对象的notify()
或者notifyAll()
方法来手动唤醒被等待的线程sleep()
则是在指定的时间过后,自动恢复执行
使用场景:
wait()
: 主要用于线程间的协作通信。例如,在生产者消费者模式中,当没有数据时,消费者线程可以调用wait()
等待通知sleep()
: 主要用于当前线程的暂停执行,通常在需要让出 CPU 时间片或者等待某个事件发生时使用
锁的状态:
wait()
: 在调用wait()
方法时,会释放对象锁(monitor),直到被唤醒才会重新获取该锁sleep()
: 不会释放任何对象锁。当前线程在睡眠期间仍然持有所有同步锁定的资源
实际可运行代码示例:
java
public class WaitSleepExample {
public static void main(String[] args) {
// 创建一个共享的对象
final Object lock = new Object();
Runnable task1 = () -> {
synchronized (lock) {
System.out.println("Thread 1: 开始等待");
try {
lock.wait(); // 线程1进入wait状态,并释放锁
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Thread 1: 被唤醒,继续执行");
}
};
Runnable task2 = () -> {
synchronized (lock) {
System.out.println("Thread 2: 唤醒线程1");
lock.notify(); // 唤醒被wait的线程
}
};
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
thread1.start();
try {
// 确保线程1已经启动并进入等待状态
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println("主线程被中断");
}
thread2.start(); // 启动线程2,唤醒线程1
Runnable sleepTask = () -> {
try {
Thread.sleep(1000); // 线程暂停执行
System.out.println("Thread 3: 停止了1秒");
} catch (InterruptedException e) {
System.out.println("Thread 3 被中断");
}
};
Thread thread3 = new Thread(sleepTask);
thread3.start();
}
}
输出示例:
Thread 1: 开始等待
Thread 2: 唤醒线程1
Thread 1: 被唤醒,继续执行
Thread 3: 停止了1秒