在Java中,sleep()和wait()方法都能暂停线程的执行,但它们有一些不同之处。
1、sleep属于Thread类中的static方法而wait属于Object类的方法。
2、等待条件是否存在:sleep()方法只是单纯地暂停当前线程的执行,而不关心任何线程间的通信。而wait()方法则需要等待其他线程发送一个notify()或者notifyAll()通知信号,以告知该线程可以继续执行下去了。
3、 锁的持有:sleep()方法不会释放锁,即使当前线程持有某个对象的锁,调用该对象的sleep()方法也不会导致这个锁被释放掉。而在调用wait()方法时,当前线程必须拥有该对象的锁,并在等待期间会释放锁,以让其他线程可以获得锁并修改对象状态。
4、异常处理:sleep()方法会休眠指定时间后自动恢复执行,而wait()方法最好要结合notify()或notifyAll()使用,否则可能会因为死锁、饿死等问题一直处于等待状态 sleep属于TIMED_WAITING,自动被唤醒;wait属于WAITING,需要手动唤醒。
以下是示例代码:
// sleep()方法的示例
public class SleepDemo {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 5; i++) {
System.out.println("Current count: " + i);
Thread.sleep(1000); // 休眠1秒钟
}
}
}
// wait()方法的示例
public class WaitDemo {
public static void main(String[] args) throws InterruptedException {
Object lockObject = new Object();
synchronized (lockObject) {
System.out.println("准备等待通知信号");
lockObject.wait(); // 等待通知信号
System.out.println("收到了通知信号,继续执行");
}
}
}
在以上示例代码中,SleepDemo类使用sleep()方法暂停了当前线程一段时间,WaitDemo类使用wait()方法来进行线程间的通信。WaitDemo类必须在持有lockObject对象的锁的前提下才能调用wait()方法,并等待其他线程发送通知信号。当其他线程调用notify()或者notifyAll()方法时,WaitDemo类就可以收到信号并继续执行了。