1.当一个线程使用的同步方法中用到某个变量,而此变量又需要其他线程修改后才能符合本线程需要,那么可以在同步方法中使用wait()方法。
2.wait方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。
其他线程如果在使用这个同步方法时不需要等待,那么它使用完这个同步方法的通知,应当用notify()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。
3.曾中断的线程就会从刚才的中断处继续执行这个同步方法,并遵循先中断先继续得原则。
4.如果使用notify()方法,那么只是通知处于等待中的线程的某一个结束等待
5.wait(),notify()和notifyAll()都是object类中的final方法,被所有的类继承,且不允许重写的方法。
张飞和李逵买电影票,售票员只有两张五元的钱,电影票五元钱一张。张飞拿二十元一张的人民币排在李逵的前面买票,李逵拿一张五元的人民币买票。因此张飞必须等待(还是李逵先买了票)
public class wait_notify_notifyAll {
public static void main(String args[]){
TicketHouse officer = new TicketHouse();
Thread zhangfei,likui;
zhangfei = new Thread(officer);
zhangfei.setName("张飞");
likui = new Thread(officer);
likui.setName("李逵");
zhangfei.start();
likui.start();
}
}
class TicketHouse implements Runnable{
int fiveAmount = 2,tenAmount = 0,twentyAmount = 0;
@Override
public void run() {
if(Thread.currentThread().getName().equals("张飞")){
saleTicket(20);
}else if(Thread.currentThread().getName().equals("李逵")){
saleTicket(5);
}
}
private synchronized void saleTicket(int money){
if(money==5){//如果使用该方法的线程传递的参数是5,就不用等待
fiveAmount = fiveAmount+1;
System.out.println("给"+Thread.currentThread().getName()+"入场券,"+Thread.currentThread().getName()+"的钱正好");
}else if(money==20){
while (fiveAmount<3){
try{
System.out.println("\n"+Thread.currentThread().getName()+"靠边等待");
wait();//如果使用该方法的线程传递的参数是20须等待
System.out.println("\n"+Thread.currentThread().getName()+"继续买票");
}catch (Exception e){
}
}
fiveAmount = fiveAmount -3;
twentyAmount = twentyAmount+1;
System.out.println("给"+Thread.currentThread().getName()+"入场券,"+Thread.currentThread().getName()+"给20,找零15元");
}
notifyAll();
}
}