基本区别:
1.wait()是Object类中定义的方法,sleep()是Thread类中定义的方法
2.sleep()方法在任何地方都可以用到,wait()只能在synchronized方法中或者synchronized代码块中使用,是因为它要释放锁,而要释放锁的前提必须先获取到锁。
本质区别:
thread.sleep()会释放CPU,但是不会释放对象锁
object.wait()会释放CPU,同时也会释放对象锁
public class Test {
public static void main(String[] args) {
final Object lock = new Object();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread A is waiting to get lock");
synchronized (lock){
System.out.println("thread A get lock ");
try {
Thread.sleep(20);
System.out.println("Thread A do wait method");
lock.wait(1000);
System.out.println("Thread A is done");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread B is waiting to get lock");
synchronized (lock){
System.out.println("thread B get lock ");
try {
Thread.sleep(10);
System.out.println("Thread B do wait method");
System.out.println("Thread B is done");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
输出的结果是:
thread A is waiting to get lock
thread A get lock
thread B is waiting to get lock
Thread A do wait method
thread B get lock
Thread B do wait method
Thread B is done
Thread A is done