
sleep() 和 wait() 是 Java 中用于线程控制的两个方法,但它们有着显著的区别。以下是它们的主要区别:
- 所属类和方法签名
sleep():
所属类:Thread 类 方法签名:public static void sleep(long millis) throws InterruptedException sleep() 是静态方法,可以在任何代码中调用,不需要对象实例。
wait():
所属类:Object 类 方法签名:public final void wait() throws InterruptedException wait() 是实例方法,只能在同步代码块或同步方法中调用,必须持有调用对象的锁。
- 锁机制
sleep():
调用 sleep() 的线程不会释放它持有的锁(如果有的话)。 它只是让当前线程暂停执行指定的时间,然后恢复执行。
wait():
调用 wait() 的线程会释放它持有的锁(调用对象的锁)。 在等待期间,其他线程可以访问和修改该对象。 线程只有在被 notify() 或 notifyAll() 唤醒后,并且重新获得锁后,才能继续执行。
- 使用场景
sleep():
常用于暂停当前线程的执行,让出 CPU 资源给其他线程。 适用于简单的延时操作,不涉及对象锁的释放和重新获取。
wait():
常用于线程间的通信,特别是在生产者-消费者模式中。 用于在特定条件下暂停线程,直到被其他线程显式唤醒。
- 异常处理
sleep() 和 wait() 都会抛出 InterruptedException,表示线程在等待过程中被中断。 调用这两个方法时,通常需要处理这个异常,例如通过捕获异常或声明方法抛出异常。
示例代码 sleep() 示例: java复制代码public class SleepExample { public static void main(String[] args) { System.out.println("Sleep starts"); try { Thread.sleep(2000); // 暂停2秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Sleep ends"); }} wait() 示例: java复制代码public class WaitExample { private static final Object lock = new Object(); public static void main(String[] args) { Thread t1 = new Thread(() -> { synchronized (lock) { try { System.out.println("Thread 1 is waiting"); lock.wait(); // 等待 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread 1 is resumed"); } }); Thread t2 = new Thread(() -> { synchronized (lock) { try { Thread.sleep(2000); // 延时2秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread 2 is notifying"); lock.notify(); // 唤醒 } }); t1.start(); t2.start(); }} 总结来说,sleep() 和 wait() 虽然都用于暂停线程的执行,但它们在锁机制、使用场景和异常处理上有明显的区别。
