对于这两者的区别,我刚开始巧案例时用Thread进行联想怎么都出不来wait()这个方法,查API之后才明白:Sleep()方法是属于Thread类中的,而wait()方法是属于Object类的。
sleep方法是使当前线程休眠一段时间,让出CPU给其他线程,但是它的监控状态依然保持着,当时间结束后又会自动恢复运行状态。该方法不会释放对象锁。
wait()方法被调用时,会释放对象锁,进入此对象的等待锁定池。只有针对此对象调用notify()方法后该线程才会进入对象锁定池准备,获取对象锁进入运行状态。案例如下:
package com.lff.demo2;
/**
*
* @author Hope_lee
* @date 2018年10月8日 上午12:29:14
*/
public class LFFTest {
public static void main(String[] args) {
new Thread(new Thread1()).start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new Thread2()).start();
}
private static class Thread1 implements Runnable{
@Override
public void run() {
synchronized (LFFTest.class) {
System.out.println("Thread1 is ready");
System.out.println("Thread1 is waiting");
try {
//调用wait方法
LFFTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread1 is restart");
System.out.println("Thread1 is over!");
}
}
}
private static class Thread2 implements Runnable{
@Override
public void run() {
synchronized (LFFTest.class) {
System.out.println("Thread2 is ready");
System.out.println("Thread2 is sleeping");
//唤醒Thread1,有无该行代码输出的结果完全不同
LFFTest.class.notify();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread2 is restart");
System.out.println("Thread2 is over!");
}
}
}
}
当调用notify()方法时,控制台输出的结果是:
当Thread2类中没有调用notify()时,输出的结果如下: