java sleep和wait區別

為什么80%的碼農都做不了架構師?>>> ??hot3.png

關于sleep和wait區別解析:

sleep只是釋放CPU資源,并不釋放資源鎖對象,wait是會釋放掉資源鎖對象。

比如,有個鎖對象object,線程1和線程2都會鎖住object對象。運行線程1,線程1中使用wait方法,這個時候,線程1就處于卡死狀態了,這時候我們運行線程2,線程2中使用sleep。這時候,如果資源鎖沒有釋放,線程2是不會被執行的,因為資源鎖被線程1占用,但是wait會釋放資源鎖,所以現象就是,線程1會執行,并且拿到資源鎖。

搞個例子來看下:

public static Object lock = new Object();
//開啟一個線程1
new Thread(() ->
{//首先搞個鎖對象synchronized (lock) {System.out.println("線程1已拿到資源鎖對象");try {//注意此處的區別//lock.wait(5000);Thread.sleep(5000);} catch (Exception ex) {ex.printStackTrace();}System.out.println("線程1資源鎖準備釋放");}}).start();Thread.sleep(10);//開啟一個線程2
new Thread(() ->
{//首先搞個鎖對象synchronized (lock) {System.out.println("線程2已拿到資源鎖對象");try {Thread.sleep(1000);} catch (Exception ex) {ex.printStackTrace();}System.out.println("線程2資源鎖準備釋放");}
}).start();

注意線程1中注釋的代碼,我們先來看下都是sleep情況下的結果,如下圖,線程1資源釋放后,線程2才能拿到鎖繼續執行。

3ddfad9ce09b0efa4f22850b0234cb9aca7.jpg

接下來我們把線程1中的sleep換成wati方法來看下結果,線程1拿到資源鎖后,調用wait會釋放資源鎖,這時線程2就可以拿到鎖的。如果線程1wait到時間后會繼續執行。

466149f1d6be24110a6fc4146147886cb83.jpg

接下來測試下,wait喚醒后是否會拿到鎖后執行,還是不用拿鎖執行。調整下代碼,線程1中的wait去掉時間設定,改為手工喚醒。線程2中添加喚醒線程1的方法,然后運行程序看下結果。

//開啟一個線程1
new Thread(() ->
{//首先搞個鎖對象synchronized (lock) {System.out.println("線程1已拿到資源鎖對象");try {//注意此處的區別lock.wait();//Thread.sleep(5000);} catch (Exception ex) {ex.printStackTrace();}System.out.println("線程1資源鎖準備釋放");}}).start();Thread.sleep(10);//開啟一個線程2
new Thread(() ->
{//首先搞個鎖對象synchronized (lock) {System.out.println("線程2已拿到資源鎖對象");try {Thread.sleep(1000);//測試線程1是否會再次拿到鎖對象lock.notify();System.out.println("已喚醒線程1");Thread.sleep(3000);} catch (Exception ex) {ex.printStackTrace();}System.out.println("線程2資源鎖準備釋放");}
}).start();

線程2喚醒線程1后,線程1并沒有馬上執行,而是等到線程2將資源鎖釋放后,線程1才開始執行。

722859a9f1ca2c33641b912ad01b4d11d93.jpg

?

讓線程睡眠今天發現還有另外一種方式,本質上其實還是Thread.sleep()

TimeUnit.SECONDS.sleep(4);

?

?

轉載于:https://my.oschina.net/uwith/blog/3002557

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537066.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537066.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

u8轉完看不到菜單_web網頁有錯誤,無法看到操作菜單-用友U8

文章摘要:本文提供在用友U8V8.51erp軟件財務會計管理的WEB財務模塊中客戶在使用WEB功能時,沒有使用默認的設置,是將WEB功能設置在自己的網站上面,訪問WEB功能沒有問題,界面出來了,輸入用戶名、密碼、選擇帳…

.Net Core 項目引用本地類庫方式(二)

上篇文章有詳細的介紹.Net Core 項目中引用本地類庫通過打包,然后Nugety引用方式,這里再介紹一種引用包的方式 轉載于:https://www.cnblogs.com/wangshitou/p/10283800.html

深入理解equals和hashCode關系和區別

深入理解equals和hashCode關系和區別直入主題:區別:1.他們判斷對象相同的方式不一樣:2.他們判斷對象是否相等的準確率不一樣:改寫equals時總是要改寫hashcode分享一波:程序員賺外快-必看的巔峰干貨為什么要說equals和hashCode這兩…

lol韓服游戲內設置_韓服LOL進去了還不能玩?教你如何玩韓服!

領取免費韓服LOL安全號,百度搜索韓服LOL微博關注即可!上圖錯誤為常識性錯誤,LOL韓服游戲的安裝文件路徑有中文所導致的錯誤 解決方法:將安裝路徑里的中文改成英文即可 舉例 包含中文漢字的文件夾都是錯誤的 Program FilesLOL韓服 …

Jdk 和 jre 的 關系和區別

Jdk 和 jre 的 關系和區別 區別: JDK:是Java Development Kit 的簡稱–>翻譯過來就是:Java 開發工具包。是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。 JRE:是Java Runtime Environm…

OpenCV-Python入門教程7-PyQt編寫GUI界面

前面一直都是使用命令行運行代碼,不夠人性化。這篇用Python編寫一個GUI界面,使用PyQt5編寫圖像處理程序。包括:打開、關閉攝像頭,捕獲圖片,讀取本地圖片,灰度化和Otsu自動閾值分割的功能。 使用Qt Designer…

spark 廣播變量大數據_大數據處理 | Spark集群搭建及基本使用

點擊藍字關注我前面用了一篇文章詳細的介紹了集群HDFS文件系統的搭建,HDFS文件系統只是一個用于存儲數據的系統,它主要是用來服務于大數據計算框架,例如MapReduce、Spark,本文就接著上一篇文章來詳細介紹一下Spark集群的搭建及Spa…

如何將本地項目上傳到gitee

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

oracle dg 備庫未設置convert參數導致ORA-01111,ORA-01110

2019獨角獸企業重金招聘Python工程師標準>>> 查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time Apply MRP0: Back…

git回退歷史版本無法上傳_Git系列教程(二):版本庫中添加文件、版本回退

Git系列教程(一):簡介、安裝、配置我們學習了分布式和版本控制系統的概念、Git具有的8個功能以及如何在Windows上安裝Git、進行相關配置并創建版本庫。Git版本庫中添加文件Git 的工作就是創建和保存你的項目的快照及與之后的快照進行對比。我們編寫一個readme.txt文…

nginx反向代理配置如何去除前綴

使用nginx做反向代理的時候,可以簡單的直接把請求原封不動的轉發給下一個服務。設置proxy_pass請求只會替換域名,如果要根據不同的url后綴來訪問不同的服務,則需要通過如下方法: 方法一:加"/"** server {l…

「作文素材詳解」寫作必知篇:語言優美不是作文第一要求

語言優美不是作文第一要求“教孩子寫作文,老師家長應該先提升自己。”“語言優美不是作文的第一要求。”“如果教孩子寫漂亮的違心話,會害了他一輩子。”日前,著名作家肖復興來到體育東路小學,與廣州的一線語文教師交流&#xff0…

華為安裝gsm框架_華為nova5怎么下載安裝谷歌服務助手,安裝GMS框架教程

看到不少的華為nova5用戶喜歡這個谷歌服務助手,也就是想安裝這個GMS框架,可是一直不知道如何下載安裝,這個谷歌服務框架是可以在系統軟件里面可以刪除的一個APK程序,但現在有很多的軟件和游戲需要谷歌服務的支持,那咱們…

VMware安裝虛擬機并使用NAT模式連接網絡

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

PHPStudy下Apache SSL證書安裝教程

一、安裝SSL證書的環境 Apache安裝目錄:E:phpStudyPHPTutorialApache 以上為windows下測試SSL證書安裝的目錄,具體目錄請根據自己的實際環境! 二、獲取SSL證書 成功在沃通申請SSL證書后,會得到一個壓縮包文件,解壓后得到四個文件&…

laravel 集成采集_新版2020 Laravel采集網站程序

環境:php5.6數據庫:mysql5.5集成環境軟件:護衛神apache這套程序是520.ag 的網站很早的程序了是去年還是前年 應該是前年免費采集網站 但是經常掛 其實他網站掛和服務器沒有多大關系 是程序沒有作好優化這套程序可以大家做起來 自己用就可以了 放出去免費采集的話 網站容易死程…

詳解模板方法設計模式

分享一波:程序員賺外快-必看的巔峰干貨 概念 定義一個操作中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的重復代碼全部在父類里面,不同業務的,使用抽象方法,抽取給子類進…

怎么從已有文件中挑選需要的文字重新生成新文件_CAD問題全面解答(幾乎涵蓋了CAD使用的全部問題)...

1.【CTrlN無效時之解決辦法】眾所周知CTRLN是新建命令但有時候CTRLN則出現選擇面板這時只需到OP選項里調下設置操作:OP(選項)------系統-------右側有一個啟動(A顯示啟動對話框B不顯示啟動對話框)選擇A則新建命令有效,反則無效2.【Ctrl鍵無效之解決辦法】…

中國官方要求進一步加強中資商業銀行境外機構合規管理

中新社北京1月22日電 (記者 王恩博)為推動在境外設有經營性機構的中資商業銀行進一步優化集團合規管理體系,健全跨境合規管理機制,提高跨境合規管理有效性,實現境外機構安全穩健運行,中國銀保監會22日發布《關于加強中資商業銀行境…