wait() 和 notify()

wait() : 線程掛起,等待被喚醒。
notify() : 通知其他某一個(gè)線程從掛起態(tài)轉(zhuǎn)換到就緒態(tài) 。
這兩個(gè)方法都要在sychronized塊中使用;都會(huì)釋放鎖,不過wait()是立刻釋放鎖,notify()是在退出sychronized塊時(shí)釋放鎖。

題目
建立三個(gè)線程,A線程打印10次A,B線程打印10次B,C線程打印10次C,要求線程同時(shí)運(yùn)行,交替打印10次ABC。

public class Print10TimesABCThread implements Runnable {     
        
    private String name;     
    private Object prev;     
    private Object self;     
    
    private Print10TimesABCThread(String name, Object prev, Object self) {     
        this.name = name;     
        this.prev = prev;     
        this.self = self;     
    }     
    
    @Override    
    public void run() {     
        int count = 10;     
        while (count > 0) {     
            synchronized (prev) {     
                synchronized (self) {     
                    System.out.print(name);     
                    count--;    
                      
                    self.notify();   
                }   
                try {     
                    prev.wait();     
                } catch (InterruptedException e) {     
                    e.printStackTrace();     
                }       
            }     
    
        }     
    }     
    
    public static void main(String[] args) throws Exception {     
        Object a = new Object();     
        Object b = new Object();     
        Object c = new Object();     
        Print10TimesABCThread pa = new Print10TimesABCThread("A", c, a);     
        Print10TimesABCThread pb = new Print10TimesABCThread("B", a, b);     
        Print10TimesABCThread pc = new Print10TimesABCThread("C", b, c);     
             
             
        new Thread(pa).start();  
        Thread.sleep(100);  //確保按順序A、B、C執(zhí)行  
        new Thread(pb).start();  
        Thread.sleep(100);    
        new Thread(pc).start();     
        Thread.sleep(100);    
        }     
}  

解析
按照A->B->C的執(zhí)行順序,每個(gè)線程都被它的前一個(gè)線程喚醒,因此一個(gè)線程打印字符需要拿到兩個(gè)鎖,自身的鎖和前一個(gè)線程的鎖,在打印結(jié)束之后,要通知下一個(gè)線程,也就是說要調(diào)用自身鎖的notify,之后再等待被前一個(gè)線程喚醒,為下一次打印作準(zhǔn)備。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容