共同点:两者都是暂停线程的执行。
区别:
1.sleep()是Thread类的静态方法,被native和static修饰,wait()是Object类的本地方法,被final修饰。
2.使用sleep()方法可以让当前线程休眠,休眠结束后线程继续向下执行,需要捕获线程中断异常,可以在任何地方使用。wait()方法必须放在synchronized块中,并且需要获取对象的锁。wait()方法需要其他线程调用同一对象上的notify()或者nodifyAll()方法来唤醒,也可以使用wait(long timeout)超时后线程自动苏醒。
3.sleep()没有释放锁但是释放了CPU资源,wait()释放了当前线程对对象持有的锁和CPU资源。
4.wait()用于线程间交互通信,sleep()用于当前线程休眠。
为什么wait()不定义在Thread中?
wait()是让获得了对象锁的线程等待,会自动释放当前线程占有的对象锁。要释放当前线程占有的对象锁让其进入WAITING状态,自然要操作对应的对象锁而不是当前的线程。而sleep()是让当前线程暂停执行,不涉及到对象,不需要获取对象锁。
代码示例:
// sleep让当前线程休眠,可以用在任何地方
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// object对象
Object object = new Object();
// wait调用对象的锁
synchronized (object) {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 其他线程调用同一对象上的notify方法唤醒
synchronized (object) {
// object.notifyAll();
object.notify();
}