Java線程中的sleep和wait方法的區(qū)別

根據(jù)一些資料整理如下:
一個程序中可以有多條執(zhí)行線索同時執(zhí)行,一個線程就是程序中的一條執(zhí)行線索,每個線程上都關(guān)聯(lián)有要執(zhí)行的代碼,即可以有多段程序代碼同時運行,每個程序至少都有一個線程,即main方法執(zhí)行的那個線程。

狀態(tài):就緒,運行,synchronize阻塞,wait和sleep掛起,結(jié)束。wait必須在synchronized內(nèi)部調(diào)用。

調(diào)用線程的start方法后線程進入就緒狀態(tài),線程調(diào)度系統(tǒng)將就緒狀態(tài)的線程轉(zhuǎn)為運行狀態(tài),遇到synchronized語句時,由運行狀態(tài)轉(zhuǎn)為阻塞,當synchronized獲得鎖后,由阻塞轉(zhuǎn)為運行,在這種情況可以調(diào)用wait方法轉(zhuǎn)為掛起狀態(tài),當線程關(guān)聯(lián)的代碼執(zhí)行完后,線程變?yōu)榻Y(jié)束狀態(tài)。

package thread;

public class MutiThread {

    public static void main(String[] args) {
        
        new Thread(new Thread1()).start();
        try {
            Thread.sleep(100);//讓thread1休眠
        } catch (Exception e) {
            e.printStackTrace();
        }
        new Thread(new Thread2()).start();
    }
    
    private static class Thread1 implements Runnable{
        @Override
        public void run() {
            //這里的thread1和thread2內(nèi)部run方法要用同意對象作為監(jiān)視器,不能用this,thread1的this和thread2的this不是同一個對象
            synchronized (MutiThread.class) {
                System.out.println("enter thread1");
                System.out.println("thread1 is waiting");
                
                try {
                    //thread1進入等待,并把自己的鎖讓出,等待別的線程調(diào)用notify方法
                    MutiThread.class.wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                
                System.out.println("thread1 is going on");
                System.out.println("thread1 is being over");
            }
        }
    }
    
    private static class Thread2 implements Runnable{
        @Override
        public void run() {
            synchronized(MutiThread.class){
                System.out.println("enter thread2");
                System.out.println("thread2 notify other thread");
                //如果不喚醒,thread1就無法接著進行,該方法并不是立馬讓出鎖,若是之后還有代碼,需要執(zhí)行完這些代碼后才會釋放鎖
                //告訴調(diào)用過wait方法的線程可以去參與獲得鎖的競爭
                MutiThread.class.notify();
                
                System.out.println("thread2 is sleeping");
                
                try {
                    Thread.sleep(100);//sleep并沒有讓出鎖,所以thread2接著進行,之后才輪到thread1,只是主動讓出CPU
                } catch (Exception e) {
                    e.printStackTrace();
                }
                
                System.out.println("thread2 is going on");
                System.out.println("thread2 is being over");
            }
        }
    }
}

輸出結(jié)果
enter thread1
thread1 is waiting
enter thread2
thread2 notify other thread
thread2 is sleeping
thread2 is going on
thread2 is being over
thread1 is going on
thread1 is being over

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

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

  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來依藍閱讀 7,467評論 3 87
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,251評論 0 62
  • Java多線程學習 [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 3,107評論 1 18
  • 一歲還不滿九個月的寶寶越來越有自己的意見和脾氣,你以為他不懂的,其實他全明白。今天他頑皮,我已困倦而他卻遲遲不肯睡...
    belladawen閱讀 176評論 0 0
  • 每次在車間里面,一個人擼圖的時候,都會碰到“產(chǎn)品經(jīng)理”飚過來說“喵啊,XXX頁面要做一個彈框,是給用戶XXX的,你...
    liouu閱讀 507評論 0 3

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