更多課程 選擇中心
        Java培訓

        400-111-8989

        Java培訓 > Java教程  > 正文

        wait()和sleep()的區別

        • 發布:Java培訓
        • 來源:Java教程
        • 時間:2018-03-22 11:56

        wait()和sleep()的區別

        問題:

        在線程里 wait() 和 sleep() 的區別?

        我的理解是執行 wait() 語句后,該線程仍是運行態,并且會占用CPU,但是執行 sleep()后,該線程則不會占用CPU,對嗎?

        為什么需要 sleep() 和 wait() 兩條語句:他們底層是如何實現的?

        回答

        線程 在wait 后,可以被另一個擁有相同 synchronized 對象的線程,通過調用 notify 喚醒,而 sleep 不行。wait 和 otify 能正常執行的條件是(否則會拋異常):多個線程的代碼,都包在synchronized塊中,并且 synchronized 鎖的對象需要是同一個。

        如下所示:

        Object mon = ...;

        synchronized (mon) {

        mon.wait();

        }

        上面這個線程調用了 wait后,會進入等待狀態。這時另外一個線程可以這樣做:

        synchronized (mon) { mon.notify(); }

        可以看到,synchronized鎖對象,都是mon。因此,當第二個線程調用了 notify() 方法,第一個線程就會喚醒(假設有且僅有一個線程是被包在 synchronized (mon) 中且處于等待狀態)。

        如果有多個線程在等待(且synchronized 鎖對象是同一個,如上例中的mon),則可以調用 notifyAll 來喚醒。但是,只有其中一個線程能搶到鎖并繼續執行(因為 wait 的線程都是在 synchronized 塊內,需要爭奪 synchronized 鎖)。其他的線程會被鎖住,直到他們依次獲得鎖。

        再補充幾點:

        wait 方法由 Object 對象調用(例如:你可以讓 synchronized 鎖對象調用 wait ,如上面例子的mon.wait()),而 sleep 則由線程調用。

        wait 之后,可能會偽喚醒(spurious wakeups)(正在waiting的線程,無故就被喚醒了,如遇到interrupted, timing out等情況)。因此,你需要多設置一些檢查,如果不滿足實際的運行條件,則繼續等待,如下:

        synchronized {

        while (!condition) { mon.wait(); }

        }

        當線程調用 sleep 時,并沒有釋放對象鎖,而 wait 則釋放了對象鎖:

        synchronized(LOCK) {

        Thread.sleep(1000); // LOCK is held

        }

        synchronized(LOCK) {

        LOCK.wait(); // LOCK is not held}

        最后,再小結一下:

        sleep():“我已經完成了一個時間片,在n微秒前,請不要再給我一個時間片”。這時操作系統不會讓這個線程做任何事情,直到sleep時間結束。

        wait():"我已經完成了一個時間片,在其他線程調用notify()前,請不要再給我一個時間片)。這時操作系統不會安排這個線程繼續運行,直到有人調用了notify()

        感謝大家閱讀由java教程分享的“wait()和sleep()的區別”希望對大家有所幫助,更多精彩內容請關注Java培訓機構官網

        免責聲明:本文由小編轉載自網絡,旨在分享提供閱讀,版權歸原作者所有,如有侵權請聯系我們進行刪除

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:2018年Java工程師成神之路!
        下一篇:Java 10首發,這個本地變量類型推斷你肯定沒見過!
        12大要點讓你的Java開發所向披靡~

        12大要點讓你的Java開發所向披靡~

        學習Java最好的12本免費在線電子書

        學習Java最好的12本免費在線電子書

        Java常用日志框架介紹

        Java常用日志框架介紹

        一篇文章了解RPC框架原理

        一篇文章了解RPC框架原理

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        貴州省

        福建省

        • 達內廈門軟件園中心
        廣西省

        海南省

        国产高清情侣视频2019年,限制电影福利在线观看,23伊人大香蕉 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>