wait()和sleep()的区别
- sleep是Thread类的方法,wait是Object类中定义的的方法
- sleep()方法可以被使用在任何地方,wait()方法只能在synchronized方法或synchronized块中使用
- Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”
- sleep()方法会让出CPU,但是不会释放锁资源
- wait()方法不仅会让出CPU,还会释放锁资源
wait()和sleep()的方法运用示例,加深理解
public class TestMain {
public static void main(String[] args) throws Exception {
final Object lock = new Object();
//线程一
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程一准备获取锁,进入同步块");
synchronized (lock) {
System.out.println("线程一获取到了锁,开始执行");
try {
lock.wait(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程一执行完成");
}
}
}).start();
//睡眠一秒,让线程一能先执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//线程二
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程二准备获取锁,进入同步块");
synchronized (lock) {
System.out.println("线程二获取到了锁,开始执行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("一秒后,线程二执行完成");
}
}
}).start();
//睡眠一秒,让线程二能先执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//线程三
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程三准备获取锁,进入同步块");
synchronized (lock) {
System.out.println("线程三获取到了锁,开始执行");
System.out.println("线程三执行完成");
}
}
}).start();
}
}
运行结果如下:
总结
从运行结果可以看出,由于线程一调用了wait()方法,会释放了锁,所以无需等待线程一执行完,线程二就能开始执行了。而由于线程二调用的是sleep()方法,不会释放锁资源,所以线程三需要等待线程二执行完成才能执行。
所以sleep()这个方法会让出CPU,但是不会释放锁资源,而wait()这个方法不仅会让出CPU,还会释放锁资源。