日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sleep( ) 和 wait( ) 的这 5 个区别,你知道几个

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sleep( ) 和 wait( ) 的这 5 个区别,你知道几个 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自??sleep( ) 和 wait( ) 的這 5 個區別,你知道幾個

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 后可能還是有機會重新競爭到鎖繼續執行的。

總結

以上是生活随笔為你收集整理的sleep( ) 和 wait( ) 的这 5 个区别,你知道几个的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。