1、为什么wait()、notify()方法要放到Object中,而不是Thread中?
wait()方法:该方法用来使得当前线程进入等待状态,直到接到通知或者被中断打断为止。在调用wait()方法之前,线程必须要获得该对象的对象级锁,否则会抛出IllegalMonitorStateException异常;换句话说就是该方法只能在同步方法或者同步块中调用。调用wait()方法之后,当前线程则释放锁。
notify()方法:该方法用来唤醒处于等待状态获取对象锁的其他线程。如果有多个线程则线程规划器任意选出一个线程进行唤醒,使其去竞争获取对象锁,但线程并不会马上就释放该对象锁,wait()所在的线程也不能马上获取该对象锁,要程序退出同步块或者同步方法之后,当前线程才会释放锁,wait()所在的线程才可以获取该对象锁。
wait()方法是释放锁的;notify()方法不释放锁,必须等到所在线程把代码执行完。
public class Tt {
public static Object lock = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
try {
synchronized (lock) {
lock.wait();
System.out.println("t1 synchronized " + System.nanoTime());
}
System.out.println("t1 end " + System.nanoTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
synchronized (lock) {
lock.notify();
System.out.println("t2 end " + System.nanoTime());
}
}
});
Thread t3 = new Thread(new Runnable(){
@Override
public void run() {
synchronized (lock) {
System.out.println("t3 end " + System.nanoTime());
}
}
});
t1.start();
t2.start();
t3.start();
}
}
运行结果如下:
t2 end 6471154195644
t3 end 6471154354939
或者
t2 end 6702284177847
t1 synchronized 6702284358474
t1 end 6702284416098
t3 end 6702284485634
(顺序不定)
分析:
第一种结果:因为线程t2、t3在t1之前竞争到lock对象的锁,t1调用wait,之后程序一直阻塞。
第二种结果:因为线程在t1调用wait方法之后,t2竞争到lock对象的锁,调用notify,t1运行完成。
2、Object对象的wait方法和Thread对象的sleep方法区别?
https://blog.csdn.net/dreamweaver_zhou/article/details/79876805
3、jdk1.5之后的Condition线程之间通信用法?