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();
}
}