在Java线程中,sleep()
和wait()
都是用于线程间的控制和同步,但它们的用途和行为有很大的区别。
sleep()
方法:
sleep()
方法是Thread
类的一个静态方法,用于使当前线程进入阻塞状态,指定的时间内不会执行任何任务。sleep()
方法不会释放持有的任何锁。即使当前线程持有锁,调用sleep()
也不会导致其他线程进入同步等待状态。sleep()
方法的使用场景通常是让当前线程暂停执行一段时间,以便让其他线程有机会执行。
示例:
public class SleepExample {
public static void main(String[] args) {
System.out.println("Start");
try {
Thread.sleep(2000); // 当前线程休眠2秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End");
}
}
wait()
方法:
wait()
方法是Object
类的一个实例方法,用于使当前线程进入等待状态,直到其他线程调用相同对象的notify()
或notifyAll()
方法唤醒它。wait()
方法必须在同步块或同步方法中调用,否则会抛出IllegalMonitorStateException
异常。- 调用
wait()
方法后,当前线程会释放持有的锁,并进入等待队列,允许其他线程获得相同锁并继续执行。 wait()
方法的使用场景通常是线程间的协调和通信,通过等待和唤醒机制实现线程间的同步。
示例:
public class WaitExample {
public static void main(String[] args) {
Object lock = new Object();
new Thread(() -> {
synchronized (lock) {
System.out.println("Thread 1: Start");
try {
lock.wait(); // 线程1进入等待状态,释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1: End");
}
}).start();
new Thread(() -> {
synchronized (lock) {
System.out.println("Thread 2: Start");
lock.notify(); // 唤醒等待中的线程1
System.out.println("Thread 2: End");
}
}).start();
}
}
总结:
sleep()
用于使当前线程暂停执行一段时间,不会释放锁。wait()
用于使当前线程进入等待状态,会释放锁,直到其他线程通知唤醒它。
在多线程编程中,理解这两个方法的区别和正确使用它们是保证线程安全和正确同步的关键。