在線程同步方法中使用wait(),notify()和notifyAll()方法

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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章