Java Thread(執行緒)案例詳解sleep和wait的區別
阿新 • • 發佈:2019-02-18
使用Wait()方法輸出結果:【顯示輸出】
我們來大致分析一下此段程式碼,main()方法中例項化ThreadTest並啟動該執行緒,然後呼叫該執行緒的一個方法(secondMethod()),因為在主執行緒中呼叫方法,所以呼叫的普通方法secondMethod())會先被執行(但並不是普通方法執行完畢該物件的執行緒方法才執行,普通方法執行過程中,該執行緒的方法也會被執行,他們是交替執行的,只是在主執行緒的普通方法會先被執行而已),所以程式執行時會先執行secondMethod(),而secondMethod()方法程式碼片段中有synchronized block,因此secondMethod方法被執行後,該方法會佔有該物件機鎖導致該物件的執行緒方法一直處於阻塞狀態,不能執行,直到secondeMethod釋放鎖;
使用Thread.sleep(2000)方法時,因為sleep在阻塞執行緒的同時,並持有該物件鎖,所以該物件的其他同步執行緒(secondMethod())無法執行,直到synchronized block執行完畢(sleep休眠完畢),secondMethod()方法才可以執行,因此輸出結果為number*200+100;
使用this.wait(2000)方法時,secondMethod()方法被執行後也鎖定了該物件的機鎖,執行到this.wait(2000)時,該方法會休眠2S並釋當前持有的鎖,此時該執行緒的同步方法會被執行(因為secondMethod持有的鎖,已經被wait()所釋放),因此輸出的結果為:number+100;
【顯示流程】
sleep()和wait()方法的區別已經講解完畢,若對執行緒有興趣的童鞋我在諾諾的問問:在main方法中最後行加入“System.out.println("number="+threadTest.number);”猜猜會輸出什麼結果。。。J
我們來大致分析一下此段程式碼,main()方法中例項化ThreadTest並啟動該執行緒,然後呼叫該執行緒的一個方法(secondMethod()),因為在主執行緒中呼叫方法,所以呼叫的普通方法secondMethod())會先被執行(但並不是普通方法執行完畢該物件的執行緒方法才執行,普通方法執行過程中,該執行緒的方法也會被執行,他們是交替執行的,只是在主執行緒的普通方法會先被執行而已),所以程式執行時會先執行secondMethod(),而secondMethod()方法程式碼片段中有synchronized block,因此secondMethod方法被執行後,該方法會佔有該物件機鎖導致該物件的執行緒方法一直處於阻塞狀態,不能執行,直到secondeMethod釋放鎖;
使用Thread.sleep(2000)方法時,因為sleep在阻塞執行緒的同時,並持有該物件鎖,所以該物件的其他同步執行緒(secondMethod())無法執行,直到synchronized block執行完畢(sleep休眠完畢),secondMethod()方法才可以執行,因此輸出結果為number*200+100;
使用this.wait(2000)方法時,secondMethod()方法被執行後也鎖定了該物件的機鎖,執行到this.wait(2000)時,該方法會休眠2S並釋當前持有的鎖,此時該執行緒的同步方法會被執行(因為secondMethod持有的鎖,已經被wait()所釋放),因此輸出的結果為:number+100;
【顯示流程】
sleep()和wait()方法的區別已經講解完畢,若對執行緒有興趣的童鞋我在諾諾的問問:在main方法中最後行加入“System.out.println("number="+threadTest.number);”猜猜會輸出什麼結果。。。J