一、区别:
1、所属类不同:wait()是Object类中的非静态方法;sleep()、yield()是Thread类中的静态方法。
2、作用不同:wait()用于线程同步或者线程之间进行通信;sleep()用于休眠当前线程,并在指定的时间点被自动唤醒;yield()临时暂停当前正在执行的线程,来让有同样优先级的正在等待的线程有机会执行(如果等待的线程优先级较低,则当前线程继续执行)。
3、释放资源:wait()释放对象锁;sleep()不释放对象锁,抱着锁睡觉;yield()仅释放线程所占用的CPU。
4、应用场景不同:wait()适用于同步代码块中;sleep()休眠当前线程,应用场景没有限制;yield()暂停当前线程,应用场景也没有限制。
5、被唤醒后的状态不同:wait()被notify()或者notifyAll()唤醒后,先进入阻塞状态(先获得锁),然后进入就绪状态;sleep()被唤醒后,进入就绪状态;yield()不需要唤醒,一直处于就绪状态,获得CPU后继续运行。
wait
方法是实例方法(非 static
方法),因此不能在 static
中使用。wait/notify 必须搭配 synchronized 使用,否则会报错。
二、代码验证
wait释放锁
//wait释放锁验证
public class WaitDemo {
public static void main(String[] args) {
WaitDemo waitDemo = new WaitDemo();
// 启动新线程,防止主线程被休眠
new Thread(() -> {
try {
waitDemo.doWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"线程t1").start();
try{
Thread.sleep(200);// 此行本身没有意义,是为了确保 wait() 先执行再执行 notify()}
}catch (InterruptedException e){
e.printStackTrace();
}
waitDemo.doNotify();
}
/**
* 执行 wait()
*/
private void doWait() throws InterruptedException {
/*
System.out.println("wait start.");
this.wait();
System.out.println("wait end.");
*/
synchronized (this) {
System.out.println("wait start.");
this.wait();
System.out.println("wait end.");
}
}
/**
* 执行 notify()
*/
private void doNotify() {
/*
System.out.println("notify start.");
this.notify();
System.out.println("notify end.");
*/
synchronized (this) {
System.out.println("notify start.");
this.notify();
System.out.println("notify end.");
}
}
}
结果
SleepDemo
public class SleepDemo {
private static Object locker = new Object();
public static void main(String[] args) throws InterruptedException {
SleepDemo sleepDemo = new SleepDemo();
// 启动新线程,防止主线程被休眠
new Thread(() -> {
synchronized (locker) {
try {
System.out.println("sleep start.");
Thread.sleep(1000);
System.out.println("sleep end.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
Thread.sleep(200);
sleepDemo.doNotify();
}
/**
* 执行 notify()
*/
private void doNotify() {
synchronized (locker) {
System.out.println("notify start.");
locker.notify();
System.out.println("notify end.");
}
}
}
执行结果
参考文章
https://blog.csdn.net/weixin_39636102/article/details/113323853