1. 程式人生 > >sleep與wait的區別

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()方法正在執行的

多執行緒同步中sleepwait區別

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():釋

sleepwait區別

一sleep 是執行緒類(Thread)的方法,導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復,呼叫sleep 不會釋放物件鎖。由於沒有釋放物件鎖,所以不能呼叫裡面的同步方法。sleep()使當前執行緒進入停滯狀態(阻塞當前執行緒

Java中sleepwait區別

學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下:1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),在sle

sleepwait方法

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 SleepWait區別

1、這兩個方法來自不同的類,sleep來自Thread類,wait 來自Object類。   sleep是Thread的靜態類方法,誰呼叫的誰去睡覺,即使是在a執行緒離呼叫了b的sleep方法,實際上還是a 去睡覺,要讓b去睡覺要在b的程式碼中呼叫sleep. 2、最主要

java中sleepwait的不同

1,sleep()方法是屬於Thread類中的,wait()方法是屬於Object類中的 2,sleep()方法導致了程式暫停執行指定的時間,讓出cpu,給其他執行緒,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復執行狀態。 3,在呼叫sleep()方法的過程中,執行緒不會釋放物件

sleepwait區別

區別一:所屬物件不一樣 sleep方法是Thread類裡面的方法,而wait是Object裡面的方法,Object大家都知道是“祖宗類”也就是說所有的方法都有wait方法,也都可以呼叫wait方法。在Object中wait方法是一個過載的方法,分別為wait(long t

sleepwait區別(執行緒基本必問的)

     這個問題在面試執行緒方面的知識時,基本上屬於必問的問題。因此這裡有必要做一個較為詳細的總結。    區別一                  首先需要明白的是這兩個方法根本來自不同的類,sleep來自Thread,wait來自Object類。           

Java 多線程 sleep()方法wait()方法的區別

程序 一段 exc 非靜態方法 not mil java程序 div 推薦   sleep()方法會使線程暫停執行一段時間,wait()方法會阻塞線程,直到被喚醒或等待時間超時。   兩者區別具體如下:   1 原理不同   sleep()方法是Thread類的靜態方法,使

博眾娛樂源碼搭建sleepwait區別

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、它們都

sleepwait區別

毫秒 機制 捕獲 控制 斷線 捕獲異常 程序 rup 同步 Java中的多線程是一種搶占式的機制,而不是分時機制。搶占式的機制是有多個線程處於可運行狀態,但是只有一個線程在運行。 共同點 : 1. 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,並返回。 2

多線程中sleepwait區別,以及多線程的實現方式及原因,定時器--Timer

守護 驗證 取消 技術 方法 代碼 安全 接口 art 1. Java中sleep和wait的區別 ① 這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。 sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程裏調用b