notify();//一旦执行此方法,就会唤醒wait的一个线程。如果有多个线程被wait,就唤醒优先级高的那个。
notifyAll();//一旦执行此方法,就会唤醒所有wait的一个线程。
wait(); //一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。
1.wait, notify(),notifyAll() 三个方法必须使用在同步代码块或同步方法中。
2.wait, notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中的同步监视器。
3.wait, notify(),notifyAll()按个方式是定义在java.lang.Object类中。
class sellTicketsAction implements Runnable {
private int ticket = 1000;
@Override
public void run() {
while (true) {
synchronized (this) {
notify();//一旦执行此方法,就会唤醒wait的一个线程。如果有多个线程被wait,就唤醒优先级高的那个。
//notifyAll();//一旦执行此方法,就会唤醒所有wait的一个线程。
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "卖票号为:" + ticket);
ticket--;
try {
wait(); //一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
}
sleep()和wait()的异同?
相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。
不同点:1)两个方法声明的地方不同,Thread类中声明sleep().Object类中声明wait(),.
2)调用的要求不同:sleep()可以在任何需要的场景下调用,wait()必须使用在同步代码块。
3)如果两个方法同时使用在同步代码块中,sleep()不会释放线程,wait()会释放当前线程。



