sleep與wait的區別
一
sleep 是執行緒類(Thread)的方法,導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復,呼叫sleep 不會釋放物件鎖。由於沒有釋放物件鎖,所以不能呼叫裡面的同步方法。
sleep()使當前執行緒進入停滯狀態(阻塞當前執行緒),讓出CUP的使用、目的是不讓當前執行緒獨自霸佔該程序所獲的CPU資源,以留一定時間給其他執行緒執行的機會;
sleep()是Thread類的Static(靜態)的方法;因此他不能改變物件的機鎖,所以當在一個Synchronized塊中呼叫Sleep()方法是,執行緒雖然休眠了,但是物件的機鎖並木有被釋放,其他執行緒無法訪問這個物件(即使睡著也持有物件鎖)。
在sleep()休眠時間期滿後,該執行緒不一定會立即執行,這是因為其它執行緒可能正在執行而且沒有被排程為放棄執行,除非此執行緒具有更高的優先順序。
wait()方法是Object類裡的方法;當一個執行緒執行到wait()方法時,它就進入到一個和該物件相關的等待池中,同時失去(釋放)了物件的機鎖(暫時失去機鎖,wait(long timeout)超時時間到後還需要返還物件鎖);可以呼叫裡面的同步方法,其他執行緒可以訪問;
wait()使用notify或者notifyAlll或者指定睡眠時間來喚醒當前等待池中的執行緒。
wiat()必須放在synchronized block中,否則會在program runtime時扔出”java.lang.IllegalMonitorStateException“異常。
二
sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
sleep方法屬於Thread類中方法,表示讓一個執行緒進入睡眠狀態,等待一定的時間之後,自動醒來進入到可執行狀態,不會馬上進入執行狀態,因為執行緒排程機制恢復執行緒的執行也需要時間,一個執行緒物件呼叫了sleep方法之後,並不會釋放他所持有的所有物件鎖,所以也就不會影響其他程序物件的執行。但在sleep的過程中過程中有可能被其他物件呼叫它的interrupt(),產生InterruptedException異常,如果你的程式不捕獲這個異常,執行緒就會異常終止,進入TERMINATED狀態,如果你的程式捕獲了這個異常,那麼程式就會繼續執行catch語句塊(可能還有finally語句塊)以及以後的程式碼。
注意sleep()方法是一個靜態方法,也就是說他只對當前物件有效,通過t.sleep()讓t物件進入sleep,這樣的做法是錯誤的,它只會是使當前執行緒被sleep 而不是t執行緒
wait屬於Object的成員方法,一旦一個物件呼叫了wait方法,必須要採用notify()和notifyAll()方法喚醒該程序;如果執行緒擁有某個或某些物件的同步鎖,那麼在呼叫了wait()後,這個執行緒就會釋放它持有的所有同步資源,而不限於這個被呼叫了wait()方法的物件。wait()方法也同樣會在wait的過程中有可能被其他物件呼叫interrupt()方法而產生
三
這兩者的施加者是有本質區別的.
sleep()是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,也就是說,線上程裡面決定.好比如說,我要做的事情是 "點火->燒水->煮麵",而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於執行的主動權是由我的流程來控制.
支援一下吆 收藏一下: 很好
而wait(),首先,這是由某個確定的物件來呼叫的,將這個物件理解成一個傳話的人,當這個人在某個執行緒裡面說"暫停!",也是 thisOBJ.wait(),這裡的暫停是阻塞,還是"點火->燒水->煮飯",thisOBJ就好比一個監督我的人站在我旁邊,本來該線 程應該執行1後執行2,再執行3,而在2處被那個物件喊暫停,那麼我就會一直等在這裡而不執行3,但正個流程並沒有結束,我一直想去煮飯,但還沒被允許, 直到那個物件在某個地方說"通知暫停的執行緒啟動!",也就是thisOBJ.notify()的時候,那麼我就可以煮飯了,這個被暫停的執行緒就會從暫停處 繼續執行.
其實兩者都可以讓執行緒暫停一段時間,但是本質的區別是一個執行緒的執行狀態控制,一個是執行緒之間的通訊的問題
在java.lang.Thread類中,提供了sleep(),
而java.lang.Object類中提供了wait(), notify()和notifyAll()方法來操作執行緒
sleep()可以將一個執行緒睡眠,引數可以指定一個時間。
而wait()可以將一個執行緒掛起,直到超時或者該執行緒被喚醒。
wait有兩種形式wait()和wait(milliseconds).
sleep和wait的區別有:
1,這兩個方法來自不同的類分別是Thread和Object
2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
生產者與消費者模式:
1234567891011121314151617181920212223242526272829303132333435363738394041相關推薦sleep()與wait()區別執行緒問題的總結參考:https://blog.csdn.net/u012050154/article/details/509033261、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的 多執行緒同步中sleep與wait區別1、函式 wait是Object的一個函式,指執行緒處於進入等待狀態,此時執行緒不佔用任何資源,不增加時間限制。wait可以被notify和notifyAll函式喚醒(這兩個也是Object的函 Java中sleep()與wait()區別學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下:1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),在slee Java中sleep()與wait()區別標記一下學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下: 1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務), 執行緒中sleep()與wait()的區別對時間的指定。 1,sleep方法必須指定時間。 2,wait方法有過載形式,可以指定時間,也可以不指定時間。 對於執行權和鎖的操作.: 1,sleep():釋放執行權,不釋放鎖,因為肯定能醒,肯定可以恢復到臨時阻塞狀態。 2,wait():釋 sleep與wait的區別一sleep 是執行緒類(Thread)的方法,導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復,呼叫sleep 不會釋放物件鎖。由於沒有釋放物件鎖,所以不能呼叫裡面的同步方法。sleep()使當前執行緒進入停滯狀態(阻塞當前執行緒 Java中sleep與wait的區別學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下:1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),在sle sleep與wait方法mce wait del 釋放 用法比較 類的方法 try 阻塞 done 1.wait 屬性Object類 sleep屬性 Thread 類 1. sleep 是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持 sleep&wait區別1.sleep是屬於Thread類的 wait是屬於Object類的2.sleep:在sleep()方法執行過程中執行緒----->不會釋放物件鎖 wait: 在wait()方法執行過程中執行緒 ------>釋放物件鎖 --》引用: 對於sleep()方法,我 Android Sleep和Wait區別1、這兩個方法來自不同的類,sleep來自Thread類,wait 來自Object類。 sleep是Thread的靜態類方法,誰呼叫的誰去睡覺,即使是在a執行緒離呼叫了b的sleep方法,實際上還是a 去睡覺,要讓b去睡覺要在b的程式碼中呼叫sleep. 2、最主要 java中sleep與wait的不同1,sleep()方法是屬於Thread類中的,wait()方法是屬於Object類中的 2,sleep()方法導致了程式暫停執行指定的時間,讓出cpu,給其他執行緒,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復執行狀態。 3,在呼叫sleep()方法的過程中,執行緒不會釋放物件 sleep和wait區別區別一:所屬物件不一樣 sleep方法是Thread類裡面的方法,而wait是Object裡面的方法,Object大家都知道是“祖宗類”也就是說所有的方法都有wait方法,也都可以呼叫wait方法。在Object中wait方法是一個過載的方法,分別為wait(long t sleep和wait區別(執行緒基本必問的)這個問題在面試執行緒方面的知識時,基本上屬於必問的問題。因此這裡有必要做一個較為詳細的總結。 區別一 首先需要明白的是這兩個方法根本來自不同的類,sleep來自Thread,wait來自Object類。 Java 多線程 sleep()方法與wait()方法的區別程序 一段 exc 非靜態方法 not mil java程序 div 推薦 sleep()方法會使線程暫停執行一段時間,wait()方法會阻塞線程,直到被喚醒或等待時間超時。 兩者區別具體如下: 1 原理不同 sleep()方法是Thread類的靜態方法,使 博眾娛樂源碼搭建與sleep和wait的區別read 如果 運行 inter rup 需要 兩個 sleep bject sleep和wait的區別 1、這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。 sleep是Thread的靜態類方法,誰調用的誰去睡覺,(博眾娛樂源碼搭 wait()與sleep()方法的區別相同點: 都使程式進入一個暫停的狀態, 不同點: wait():當執行緒等待狀態為真,其他程式申請執行緒時,該執行緒會釋放執行緒鎖;如果該執行緒呼叫notify()方法,本執行緒會進入物件鎖定池準備,獲取物件鎖進入執行狀態。 .sleep();程式暫停執行指定的時間, sleep()方法與wait()方法有什麼區別?個人部落格:小景哥哥 sleep()方法與wait()方法有什麼區別? sleep()是使執行緒暫停執行一段時間的方法。wait()也是一種使執行緒暫停執行的方法。二者區別為: ①原理不同。 sleep()方法是Thread類的靜態方法,是執行緒用來控制自身流程的 wait(1000)與sleep(1000)的區別sleep和wait的區別: 1、sleep是Thread的靜態方法,wait是Object的方法,任何物件例項都能呼叫。 2、sleep不會釋放鎖,它也不需要佔用鎖。wait會釋放鎖,但呼叫它的前提是當前執行緒佔有鎖(即程式碼要在synchronized中)。 3、它們都 sleep和wait的區別毫秒 機制 捕獲 控制 斷線 捕獲異常 程序 rup 同步 Java中的多線程是一種搶占式的機制,而不是分時機制。搶占式的機制是有多個線程處於可運行狀態,但是只有一個線程在運行。 共同點 : 1. 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,並返回。 2 多線程中sleep和wait的區別,以及多線程的實現方式及原因,定時器--Timer守護 驗證 取消 技術 方法 代碼 安全 接口 art 1. Java中sleep和wait的區別 ① 這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。 sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程裏調用b |