1.wait()和sleep()的区别
wait()是Object类的方法,sleep()是Thread类的方法;
调用Object对象的wait方法,线程会放弃对象锁,进入等待此对象的等待锁定池;只有针对对象调用notify()方法后当前线程才进入对象锁定池准备获取对象锁进入运行状态,如果没有notify,对应的线程会挂起;
sleep()方法会让程序暂停执行指定的时间,让出CPU给其他线程,但是他的监控状态依然保持者,到达指定时间当前线程会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。
2.实例Demo
public class ThreadWait extends Thread {
@Override
public void run() {
synchronized (ThreadTest.class) {
System.out.println("ThreadWait start...");
System.out.println("ThreadWait waiting...");
try {
ThreadTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ThreadWait continue...");
System.out.println("ThreadWait end...");
}
}
}
public class ThreadSleep implements Runnable {
@Override
public void run() {
synchronized (ThreadTest.class) {
System.out.println("ThreadSleep start...");
System.out.println("ThreadSleep sleeping");
ThreadTest.class.notify();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ThreadSleep continue...");
System.out.println("ThreadSleep end...");
}
}
}
public class ThreadTest {
public static void main(String[] args) {
new ThreadWait().start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new ThreadSleep()).start();
}
}
有该行代码ThreadTest.class.notify()的时候,输出结果:
ThreadWait start...
ThreadWait waiting...
ThreadSleep start...
ThreadSleep sleeping
ThreadSleep continue...
ThreadSleep end...
ThreadWait continue...
ThreadWait end...
没有该行代码ThreadTest.class.notify()的时候,输出结果:
ThreadWait start...
ThreadWait waiting...
ThreadSleep start...
ThreadSleep sleeping
ThreadSleep continue...
ThreadSleep end...