sleep 和 wait 的區別

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

面試中常問的就是 sleep 和 wait 有什么不同嗎?為了面試時候發揮的更好,我在這里總結分享下。

首先對于 sleep() 方法,我們首先要知道該方法是屬于 Thread 類中的。而 wait() 方法,則是屬于Object類中的。(說完這句之后面試官會不會問你說下 object 類中的方法。。。哈哈哈)

最主要是 sleep 方法不會釋放對象鎖 ,而 wait 方法釋放對象鎖 。

sleep() 方法是線程類(Thread)的靜態方法,讓調用線程進入睡眠狀態,讓出執行機會給其他線程,等到休眠時間結束后,線程進入就緒狀態和其他線程一起競爭 cpu 的執行時間。
因為 sleep() 是 static 靜態的方法,他不能改變對象的機鎖,當一個 synchronized 塊中調用了 sleep() 方法,線程雖然進入休眠,但是對象的機鎖沒有被釋放,其他線程依然無法訪問這個對象。

當一個線程執行到 wait 方法時,它就進入到一個和該對象相關的等待池,同時釋放對象的機鎖,使得其他線程能夠訪問,可以通過 notify,notifyAll 方法來喚醒等待的線程。

package com.example.demo;public class T {public static void main(String[] args) {new Thread(new t1()).start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}new Thread(new t2()).start();}private static class t1 implements Runnable {@Overridepublic void run() {synchronized (T.class) {System.out.println("start t1...");System.out.println("t1 wait...");try {// 調用 wait()方法,線程會放棄對象鎖,進入等待此對象的等待鎖定池T.class.wait();} catch (Exception e) {e.printStackTrace();}}System.out.println("t1 going on....");System.out.println("t1 over...");}}private static class t2 implements Runnable {@Overridepublic void run() {synchronized (T.class) {System.out.println("start t2...");System.out.println("t2 sleep...");// 只有針對此對象調用 notify()方法后本線程才進入對象鎖定池準備獲取對象鎖進入運行狀態。T.class.notify();try {// sleep()方法導致了程序暫停執行指定的時間,讓出cpu該其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。// 在調用 sleep()方法的過程中,線程不會釋放對象鎖。Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}System.out.println("t2 going on....");System.out.println("t2 over...");}}}
}

第一種情況結果,使用 wait 釋放鎖,并且喚醒等待線程。

619db10d710f345de4478bf82b51e767ead.jpg

第二種情況不喚醒等待線程,注釋掉

T.class.wait();

結果程序會一直掛起。

53a42868a27da17e1b79ee66180d3fcc187.jpg

?

水平有限,若有問題請留言交流!

互相學習,共同進步:) 轉載請注明出處謝謝!

轉載于:https://my.oschina.net/hp2017/blog/1863078

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

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

相關文章

2016年11月13日周工作知識點總結

jQuery :eq() 選擇器選取帶有指定 index 值的元素。index 值從 0 開始,所有第一個元素的 index 值是 0(不是 1)。經常與其他元素/選擇器一起使用,來選擇指定的組中特定序號的元素(如下面的例子)。$("p…

DM6467之視頻采集(Linux)下MMAP

做dsp6467是在linux下做視頻采集,僅ARM端 一共有三種視頻采集方式: 1)使用read、write方式:直接使用 read 和 write 函數進行讀寫。這種方式最簡…

QPS、TPS計算

QPS (Query per second) (每秒查詢量) TPS(Transaction per second) (每秒事務量,如果是InnoDB會顯示,沒有InnoDB就不會顯示) 計算方法 QPS Questions SHOW GLOBAL STATUS LIKE Questions; Uptime SHOW G…

QT 中textEdit 和 textBrowser 無法使用斜體及加粗等 解決辦法

編輯框的幾個種類 QT 中一共四個文本編輯框 分別是 Line Edit 、Text Edit、 Plait Text Edit和textBrowser四種文本編輯框架! 一、輸入內容不同 1、LineEdit:LineEdit的輸入內容為單行文本輸入。 2、TextEdit:TextEdit的輸入內容為多行文…

【select模塊】select IO多路復用和select實現FTP

select是全平臺通用的IO多路復用模塊。最大連接數:1024。poll和epoll沒有最大連接數限制,但只能用在linux平臺。selectors是再封裝模塊,推薦使用。下篇會討論。select.select(rlist, wlist, xlist[, timeout])This is a straightforward inte…

變量屬性

變量屬性 C語言的變量屬性 C語言中的變量可以有自己的屬性在定義變量的時候加上“屬性”關鍵字屬性關鍵字指明變量的特有意義auto關鍵字 auto即C語言中局部變量的默認屬性auto表明將被修飾的變量存儲在棧上編譯器默認所有的局部變量都是auto的register關鍵字 register關鍵字指明…

WPF:How to display a Bitmap on Image control

一個Bitmap文件,叫做screenShotFile, 你可以這樣顯示到Image控件上。 BitmapImage bi new BitmapImage(); bi.BeginInit(); bi.UriSource new Uri(this.screenShotFile, UriKind.Absolute); bi.EndInit(); this.scre…

QT中$$PWD的意思

$$PWD的意思為當前目錄 如pro文件中:INCLUDEPATH $$PWD/lib/x64-win64 $$PWD表示的意思就是pro文件所在的目錄。

Dubbo 整合 Pinpoint 做分布式服務請求跟蹤

2019獨角獸企業重金招聘Python工程師標準>>> 在使用Dubbo進行服務化或者整合應用后,假設某個服務后臺日志顯示有異常,這個服務又被多個應用調用的情況下,我們通常很難判斷是哪個應用調用的,問題的起因是什么&#xff0…

Linux 進程詳解

Linux內核的七大區間 1.進程管理(進程創建,進程的三種狀態,進程間的調度,調度算法...) 2.內存管理(段式管理(Linux所有段都從0開始),頁式管理--地址偏移量) 3…

C#2.0 委托

委托 委托是一個非常不錯的設計,允許我們把方法做為參數傳遞,實現了開放閉放原則。在方法中我們只要有一個委托占位,調用者就可以傳入符合簽名的方法來做不同的操作,這也面向對象開發中多態的魅力。 但是在C#1.0的時候&#xff…

qt亂碼Could not decode“xxx.cpp“ with “UTF-8“-encoding.Editing not possible問題處理

問題描述:如題: 解決方法: 1、點擊Select Encoding按鈕 2、選擇按照系統編碼 3、選中System后點擊按編碼重新載入 4、問題解決

bootargs中的環境變量說明和一些常用的uboot命令

bootargs中的環境變量說明和一些常用的uboot命令 一些常見的uboot命令: Help [command]在屏幕上打印命令的說明 Boom [addr]啟動在內存儲器的內核 Tftpboot通過tftp啟動內核 Saveenv保存環境變量 setenv name [value] 設置環境變量 bootargs中的環境變量 co…

特斯拉自動駕駛系統秘密,來自特斯拉AI總監爆料

據外媒報道,特斯拉汽車公司人工智能(AI)總監安德烈卡帕西(Andrej Karpathy)日前參加2018年TRAIN AI大會時,剖析了該公司構建自動駕駛儀(Autopilot)計算機視覺解決方案的方法。據介紹,Autopilot編…

快捷鍵匯總

navicat 運行選中代碼 ctrshiftr navicat 運行所有代碼 ctrr 快速顯示桌面 wind 轉載于:https://www.cnblogs.com/caer/p/6064571.html

js做倒計時

var dinshiqi setInterval(timerun,1000) function timerun(){ //timegundong var now_time new Date(); var hours now_time.getHours(); //時 var minutes now_time.getMinutes(); //分 var seconds now_time.getSeconds(); //秒 //秒鐘 show_seconds 59 - parseInt(s…

QT右鍵點擊添加庫不響應的解決辦法

問題描述 QT在pro右鍵點擊添加庫不響應 解決方案 雙擊打開pro文件 在pro文件界面里單擊鼠標右鍵,并選擇添加庫。 解決問題

爬取前塵無憂python職位信息并保存到mongo數據庫

1.re實現 1 import re,os2 import requests3 from requests.exceptions import RequestException4 5 MAX_PAGE 10 #最大頁數6 KEYWORD python7 headers {8 User-Agent:9 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, lik…

實驗八——函數定義及調用總結

1.本次課學習到的知識點: (1)學習了數字金字塔。pyramid ()函數功能,函數定義時,形參n決定數字金字塔的層數; (2)不返回結果的函數定義: (3)復數運算: c1x1(y1) i,c2x2(y…

Apache JMeter 記一次使用HTTP工具POST提交JSON數據進行送積分高并發壓測(二)

一、前言 前面文章已經介紹Apache JMeter的基本概率和如果使用,但作為一個開發人員,自己寫的代碼都應該要好好的COD EREVIEW,好好的自測吧。但是有些場景比如高并發、負載和性能測試的時候,不借助工具是不好進行測試的。Jmter工具設計之初是用…