摘要:休眠和等待方法是多線程中常用的兩個方法,它們有什么區別及一些該注意的地方有哪些呢下面給大家一一分解。區別使用場景一般用于當前線程休眠,或者輪循暫停操作,則多用于多線程之間的通信。
sleep(休眠) 和 wait(等待) 方法是 Java 多線程中常用的兩個方法,它們有什么區別及一些該注意的地方有哪些呢?下面給大家一一分解。
區別1:使用限制使用 sleep 方法可以讓讓當前線程休眠,時間一到當前線程繼續往下執行,在任何地方都能使用,但需要捕獲 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 進行喚醒,它們同樣需要放在 synchronized 塊里面,且獲取對象的鎖。。
synchronized (lock) { // 隨機喚醒 lock.notify(); // 喚醒全部 lock.notifyAll(); }
當然也可以使用帶時間的 wait(long millis) 方法,時間一到,無需其他線程喚醒,也會重新競爭獲取對象的鎖繼續執行。
區別2:使用場景sleep 一般用于當前線程休眠,或者輪循暫停操作,wait 則多用于多線程之間的通信。
區別3:所屬類sleep 是 Thread 類的靜態本地方法,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;
為什么要這樣設計呢?
因為 sleep 是讓當前線程休眠,不涉及到對象類,也不需要獲得對象的鎖,所以是線程類的方法。wait 是讓獲得對象鎖的線程實現等待,前提是要楚獲得對象的鎖,所以是類的方法。
區別4:釋放鎖Object lock = new Object(); synchronized (lock) { try { lock.wait(3000L); Thread.sleep(2000L); } catch (InterruptedException e) { e.printStackTrace(); } }
如上代碼所示,wait 可以釋放當前線程對 lock 對象鎖的持有,而 sleep 則不會。
區別5:線程切換sleep 會讓出 CPU 執行時間且強制上下文切換,而 wait 則不一定,wait 后可能還是有機會重新競爭到鎖繼續執行的。
@程序猿 你們還知道別的嗎?歡迎留言!
更多干貨推薦
1.史上最強 Java 中高級面試題整理
2.史上最強 Spring Boot & Cloud 教程整理
3.史上最強架構設計分布式技術干貨整理
更多請掃描下方的二維碼關注我們的微信公眾號,干貨每日推送!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77302.html
摘要:用戶態不能干擾內核態所以指令就有兩種特權指令和非特權指令不同的狀態對應不同的指令。非特權指令所有程序均可直接使用。用戶態常態目態執行非特權指令。 這是我今年從三月份開始,主要的大廠面試經過,有些企業面試的還沒來得及整理,可能有些沒有帶答案就發出來了,還請各位先思考如果是你怎么回答面試官?這篇文章會持續更新,請各位持續關注,希望對你有所幫助! 面試清單 平安產險 飛豬 上汽大通 浩鯨科...
摘要:為什么叫重入鎖呢,我們把它拆開來看就明了了。釋放鎖,每次鎖持有者數量遞減,直到為止。 相信大家在工作或者面試過程中經常聽到重入鎖這個概念,或者與關鍵字 synchrozied 的對比,棧長面試了這么多人,80%的面試者都沒有答對或沒有答到點上,或者把雙重效驗鎖搞混了,哭笑不得。。 那么你對重入鎖了解有多少呢?今天,棧長幫大家撕開重入鎖的面紗,來見識下重入鎖的真實容顏。。 什么是重入鎖 ...
摘要:如果線程還存活,線程就無限期等待,并讓出監視器鎖,進入狀態。當線程從狀態被喚醒后通過,或者是假喚醒將繼續競爭監視器鎖,當成功獲得監視器鎖后,他將從調用的地方恢復,繼續運行。 前言 系列文章目錄 上一篇我們討論了線程的創建,本篇我們來聊一聊線程的狀態轉換以及常用的幾個比較重要的方法。 本篇依然是通過源碼分析來了解這些知識。 本文源碼基于jdk1.8 。 閱讀完本文,你應當有能力回答以...
閱讀 995·2021-11-23 09:51
閱讀 3488·2021-11-22 12:04
閱讀 2730·2021-11-11 16:55
閱讀 2960·2019-08-30 15:55
閱讀 3239·2019-08-29 14:22
閱讀 3363·2019-08-28 18:06
閱讀 1253·2019-08-26 18:36
閱讀 2139·2019-08-26 12:08