在 Java 中,sleep()
和 wait()
都是用来暂停线程执行的方法,但它们有一些关键区别:
1. 所属的类不同
sleep()
是Thread
类的方法,用于当前线程的暂停。wait()
是Object
类的方法,一般在同步代码块或方法中使用。
2. 是否需要同步块
sleep()
不需要在同步块或同步方法中使用,可以在任何地方调用。wait()
必须在同步块或同步方法中使用,否则会抛出IllegalMonitorStateException
异常。
3. 是否释放锁
sleep()
不会释放锁:如果在同步代码块中调用sleep()
,线程依然持有锁。wait()
会释放锁:在wait()
执行时,线程会释放持有的锁,其他线程可以获得锁。
4. 唤醒方式不同
sleep()
在指定时间后自动恢复运行,不需要其他线程来唤醒。wait()
需要被其他线程调用notify()
或notifyAll()
方法来唤醒,除非调用了带超时时间的wait(time)
。
5. 使用场景不同
sleep()
常用于暂停当前线程一段时间,如实现定时任务或休眠。wait()
用于线程间的通信,通常用于生产者-消费者模式,让一个线程等待另一个线程的操作结果。
示例代码
java
复制代码
public class SleepWaitDemo { public static void main(String[] args) { // 使用 sleep() Thread thread1 = new Thread(() -> { try { System.out.println("Thread1 sleeping for 2 seconds..."); Thread.sleep(2000); // 线程休眠2秒 System.out.println("Thread1 woke up."); } catch (InterruptedException e) { e.printStackTrace(); } }); // 使用 wait() 必须在同步块中 Object lock = new Object(); Thread thread2 = new Thread(() -> { synchronized (lock) { try { System.out.println("Thread2 waiting..."); lock.wait(); // 等待被唤醒 System.out.println("Thread2 notified and resumed."); } catch (InterruptedException e) { e.printStackTrace(); } } }); thread1.start(); thread2.start(); // 唤醒 thread2 new Thread(() -> { try { Thread.sleep(1000); // 延迟1秒 synchronized (lock) { System.out.println("Notifying thread2..."); lock.notify(); // 唤醒 thread2 } } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } }
总结
sleep()
暂停线程一段时间,且不会释放锁。wait()
暂停线程并释放锁,等待其他线程的notify()
或notifyAll()
调用。