欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中wait()和sleep()區(qū)別小結(jié)

 更新時間:2025年10月01日 11:39:23   作者:IT橘子皮  
在Java多線程編程中,wait()和 sleep()是兩個常用的線程控制方法,但它們在工作原理、使用場景和效果上有顯著區(qū)別,本文就來詳細的介紹一下兩者的差異,感興趣的可以了解一下

在 Java 多線程編程中,wait()sleep()是兩個常用的線程控制方法,但它們在工作原理、使用場景和效果上有顯著區(qū)別。以下是兩者的主要差異:

1. 所屬類與基本性質(zhì)

  • ?sleep()??:是 Thread類的靜態(tài)方法,可以直接通過 Thread.sleep()調(diào)用,用于讓當前線程暫停執(zhí)行指定的時間。
  • ?wait()??:是 Object類的實例方法,必須通過對象實例調(diào)用(如 obj.wait()),主要用于線程間的通信與協(xié)調(diào)。

2. 鎖的行為差異(核心區(qū)別)

  • ?sleep()??:

    • ?不釋放鎖?:當線程調(diào)用 sleep()時,即使線程進入休眠狀態(tài),它仍然持有已經(jīng)獲取的任何對象鎖。
    • 其他線程無法獲取被休眠線程持有的鎖,導(dǎo)致同步代碼塊或方法無法被并發(fā)執(zhí)行。
  • ?wait()??:

    • ?釋放鎖?:調(diào)用 wait()會使線程釋放當前持有的對象鎖,并進入該對象的等待池(waiting pool)。
    • 其他線程可以獲取該對象的鎖并執(zhí)行同步代碼。

3. 使用場景

  • ?sleep()??:

    • 用于讓線程暫停執(zhí)行一段時間,不涉及線程間通信。
    • 典型場景:模擬延遲、定時任務(wù)、控制執(zhí)行節(jié)奏等。
  • ?wait()??:

    • 用于線程間協(xié)作,通常與 notify()/notifyAll()配合使用。
    • 典型場景:生產(chǎn)者-消費者模式、線程交替執(zhí)行等需要條件等待的場景。

4. 喚醒機制

  • ?sleep()??:

    • 自動喚醒:線程會在指定的時間結(jié)束后自動恢復(fù)就緒狀態(tài)。
  • ?wait()??:

    • 需要被動喚醒:必須由其他線程調(diào)用同一對象的 notify()notifyAll()方法才能喚醒。
    • 也支持帶超時的 wait(long timeout),超時后會自動喚醒。

5. 調(diào)用前提條件

  • ?sleep()??:

    • 可以在任何地方調(diào)用,不需要在同步代碼塊中。
  • ?wait()??:

    • ?必須在同步代碼塊或同步方法中調(diào)用?(即必須先獲取對象的監(jiān)視器鎖)。
    • 否則會拋出 IllegalMonitorStateException異常。

6. 異常處理

兩者都會拋出 InterruptedException

  • 當線程在休眠或等待期間被其他線程中斷時觸發(fā)。
  • 都需要捕獲或聲明拋出該異常。

7. 線程狀態(tài)變化

  • ?sleep()??:

    • 使線程進入 ?TIMED_WAITING?(帶超時)或 ?WAITING?(無超時)狀態(tài)。
  • ?wait()??:

    • 使線程進入 ?WAITING?(無超時)或 ?TIMED_WAITING?(帶超時)狀態(tài),并釋放鎖。

代碼示例對比

sleep() 示例(不釋放鎖)

synchronized (lock) {
    System.out.println("線程獲取鎖,開始sleep");
    try {
        Thread.sleep(2000); // 休眠2秒,不釋放lock鎖
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("線程sleep結(jié)束");
}
// 其他線程必須等待sleep結(jié)束后才能獲取鎖

wait() 示例(釋放鎖)

synchronized (lock) {
    System.out.println("線程獲取鎖,開始wait");
    try {
        lock.wait(); // 釋放lock鎖,進入等待隊列
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("線程被喚醒,重新獲取鎖");
}
// 其他線程可以在wait期間獲取lock鎖

總結(jié)對比表

特性sleep()wait()
?所屬類?Thread類的靜態(tài)方法Object類的實例方法
?鎖釋放?不釋放鎖釋放鎖
?使用場景?線程暫停執(zhí)行線程間通信與協(xié)作
?喚醒方式?自動喚醒(時間到)notify()/notifyAll()喚醒
?調(diào)用前提?無需同步環(huán)境必須在 synchronized中調(diào)用
?異常?InterruptedExceptionInterruptedException+ IllegalMonitorStateException
?典型用途?定時、延遲生產(chǎn)者-消費者、條件等待

關(guān)鍵結(jié)論

  1. ?鎖行為?:sleep()持有鎖不放,wait()釋放鎖——這是最本質(zhì)的區(qū)別。
  2. ?協(xié)作機制?:wait()/notify()是 Java 多線程協(xié)作的基礎(chǔ)機制,而 sleep()只是單純的線程暫停。
  3. ?使用規(guī)范?:誤用 wait()(如不在同步塊中調(diào)用)會導(dǎo)致運行時異常,而 sleep()的使用相對簡單。

在實際開發(fā)中,應(yīng)根據(jù)是否需要線程間協(xié)作來選擇使用哪個方法:若只是需要延遲,用 sleep();若需要等待某個條件滿足(如資源就緒),則用 wait()。

到此這篇關(guān)于Java中wait()和sleep()區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Java wait()和sleep()區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論