国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

sleep( ) 和 wait( ) 的這 5 個區(qū)別,你知道幾個?

EscapedDog / 3394人閱讀

摘要:休眠和等待方法是多線程中常用的兩個方法,它們有什么區(qū)別及一些該注意的地方有哪些呢下面給大家一一分解。區(qū)別使用場景一般用于當(dāng)前線程休眠,或者輪循暫停操作,則多用于多線程之間的通信。

sleep(休眠) 和 wait(等待) 方法是 Java 多線程中常用的兩個方法,它們有什么區(qū)別及一些該注意的地方有哪些呢?下面給大家一一分解。

區(qū)別1:使用限制

使用 sleep 方法可以讓讓當(dāng)前線程休眠,時間一到當(dāng)前線程繼續(xù)往下執(zhí)行,在任何地方都能使用,但需要捕獲 InterruptedException 異常。

try {
    Thread.sleep(3000L);
} catch (InterruptedException e) {
    e.printStackTrace();
}

而使用 wait 方法則必須放在 synchronized 塊里面,同樣需要捕獲 InterruptedException 異常,并且需要獲取對象的鎖。

synchronized (lock){
    try {
        lock.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

而且 wait 還需要額外的方法 notify/ notifyAll 進(jìn)行喚醒,它們同樣需要放在 synchronized 塊里面,且獲取對象的鎖。。

synchronized (lock) {
    // 隨機(jī)喚醒
    lock.notify();
    
    // 喚醒全部
    lock.notifyAll();
}

當(dāng)然也可以使用帶時間的 wait(long millis) 方法,時間一到,無需其他線程喚醒,也會重新競爭獲取對象的鎖繼續(xù)執(zhí)行。

區(qū)別2:使用場景

sleep 一般用于當(dāng)前線程休眠,或者輪循暫停操作,wait 則多用于多線程之間的通信。

區(qū)別3:所屬類

sleep 是 Thread 類的靜態(tài)本地方法,wait 則是 Object 類的本地方法。

java.lang.Thread#sleep
public static native void sleep(long millis) throws InterruptedException;
java.lang.Object#wait
public final native void wait(long timeout) throws InterruptedException;

為什么要這樣設(shè)計呢?

因為 sleep 是讓當(dāng)前線程休眠,不涉及到對象類,也不需要獲得對象的鎖,所以是線程類的方法。wait 是讓獲得對象鎖的線程實現(xiàn)等待,前提是要楚獲得對象的鎖,所以是類的方法。

區(qū)別4:釋放鎖
Object lock = new Object();
synchronized (lock) {
    try {
        lock.wait(3000L);
        Thread.sleep(2000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

如上代碼所示,wait 可以釋放當(dāng)前線程對 lock 對象鎖的持有,而 sleep 則不會。

區(qū)別5:線程切換

sleep 會讓出 CPU 執(zhí)行時間且強(qiáng)制上下文切換,而 wait 則不一定,wait 后可能還是有機(jī)會重新競爭到鎖繼續(xù)執(zhí)行的。

@程序猿 你們還知道別的嗎?歡迎留言!

更多干貨推薦

1.史上最強(qiáng) Java 中高級面試題整理

2.史上最強(qiáng) Spring Boot & Cloud 教程整理

3.史上最強(qiáng)架構(gòu)設(shè)計分布式技術(shù)干貨整理

更多請掃描下方的二維碼關(guān)注我們的微信公眾號,干貨每日推送!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77302.html

相關(guān)文章

  • Java開發(fā) 大廠面試整理

    摘要:用戶態(tài)不能干擾內(nèi)核態(tài)所以指令就有兩種特權(quán)指令和非特權(quán)指令不同的狀態(tài)對應(yīng)不同的指令。非特權(quán)指令所有程序均可直接使用。用戶態(tài)常態(tài)目態(tài)執(zhí)行非特權(quán)指令。 這是我今年從三月份開始,主要的大廠面試經(jīng)過,有些企業(yè)面試的還沒來得及整理,可能有些沒有帶答案就發(fā)出來了,還請各位先思考如果是你怎么回答面試官?這篇文章會持續(xù)更新,請各位持續(xù)關(guān)注,希望對你有所幫助! 面試清單 平安產(chǎn)險 飛豬 上汽大通 浩鯨科...

    Scorpion 評論0 收藏0
  • 到底什么是重入鎖,拜托,一次搞清楚!

    摘要:為什么叫重入鎖呢,我們把它拆開來看就明了了。釋放鎖,每次鎖持有者數(shù)量遞減,直到為止。 相信大家在工作或者面試過程中經(jīng)常聽到重入鎖這個概念,或者與關(guān)鍵字 synchrozied 的對比,棧長面試了這么多人,80%的面試者都沒有答對或沒有答到點(diǎn)上,或者把雙重效驗鎖搞混了,哭笑不得。。 那么你對重入鎖了解有多少呢?今天,棧長幫大家撕開重入鎖的面紗,來見識下重入鎖的真實容顏。。 什么是重入鎖 ...

    LiuRhoRamen 評論0 收藏0
  • Thread類源碼解讀(2)——線程狀態(tài)及常用方法

    摘要:如果線程還存活,線程就無限期等待,并讓出監(jiān)視器鎖,進(jìn)入狀態(tài)。當(dāng)線程從狀態(tài)被喚醒后通過,或者是假喚醒將繼續(xù)競爭監(jiān)視器鎖,當(dāng)成功獲得監(jiān)視器鎖后,他將從調(diào)用的地方恢復(fù),繼續(xù)運(yùn)行。 前言 系列文章目錄 上一篇我們討論了線程的創(chuàng)建,本篇我們來聊一聊線程的狀態(tài)轉(zhuǎn)換以及常用的幾個比較重要的方法。 本篇依然是通過源碼分析來了解這些知識。 本文源碼基于jdk1.8 。 閱讀完本文,你應(yīng)當(dāng)有能力回答以...

    luqiuwen 評論0 收藏0

發(fā)表評論

0條評論

EscapedDog

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<