成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

EscapedDog / 3401人閱讀

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

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

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

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

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

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

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

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

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

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

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

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

區(qū)別3:所屬類(lèi)

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

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è)計(jì)呢?

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

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

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

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

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

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

更多干貨推薦

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

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77302.html

相關(guān)文章

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

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

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

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

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

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

    luqiuwen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<