基本差别
- sleep是Thread类的方法,wait是Object类中定义的方法
- sleep()方法可以在任何地方使用
- wait()方法只能在synchronized方法或synchronized块中使用
本质区别
- Thread.sleep智慧让出CPU,不会导致锁行为的改变
- Object.wait不仅让出CPU,还会释放已经占有的同步资源锁
public class ThreadWaitSleep {
public static void main(String[] args) {
final Object lock = new Object();
new Thread(new Runnable() {
public void run() {
System.out.println("线程A正在等待获取锁");
synchronized (lock) {
try {
System.out.println("线程A得到锁");
Thread.sleep(20);
System.out.println("线程A等待");
lock.wait(1000);
System.out.println("线程A走完");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
//睡10ms保证能进入线程A
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(new Runnable() {
public void run() {
System.out.println("线程B正在等待获取锁");
synchronized (lock) {
try {
System.out.println("线程B获得锁");
System.out.println("线程B睡10ms");
Thread.sleep(10);
System.out.println("线程B走完");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
打印日志证明wait()释放已经占有的同步资源锁