java中sleep和wait的區別

2021-08-25 17:35:27 字數 2500 閱讀 3945

結合synchronized,會更好的理解sleep()和wait()這兩個方法,當然也就知道了他們的區別了。這篇部落格就一起學習這兩個方法

sleep() 方法是執行緒類(thread)的靜態方法,讓呼叫執行緒進入睡眠狀態,讓出執行機會給其他執行緒,等到休眠時間結束後,執行緒進入就緒狀態和其他執行緒一起競爭cpu的執行時間。 

因為sleep() 是static靜態的方法,他不能改變物件的機鎖,當乙個synchronized塊中呼叫了sleep() 方法,執行緒雖然進入休眠,但是物件的機鎖沒有被釋放,其他執行緒依然無法訪問這個物件。

下面用乙個例子來演示:

service類:

public class service 

catch(exception e)}}

public void mwait()}}

就定義了兩個方法, msleep()方法會讓呼叫執行緒休眠3秒,mwait() 就列印一句話。兩個方法都使用了同步鎖。

sleepthread類:

public class sleepthread implements runnable

public void run()

}

執行緒類,用於呼叫service 的msleep方法

waitthread類:

public class waitthread implements runnable

public void run()

}

執行緒類,用於呼叫service 的mwait方法

測試類:

public class test

}

建立了乙個service物件並賦值給mservice,還建立了兩個執行緒並傳入mservice,也就是說兩個執行緒啟動後,呼叫的是同乙個service物件的方法。 

先看下結果: 

梳理一下邏輯:

首先sleepthread執行緒會啟動起來,然後在run方法裡呼叫service物件的msleep方法,到了同步**塊後,this就是test類裡建立的service物件mservice,sleepthread執行緒獲得了service物件的鎖,之後進入了休眠狀態,但並沒有釋放該service物件的鎖。 

這時waitthread執行緒也啟動了起來,呼叫service物件的mwait方法,同樣到了同步**塊,因為service物件的鎖已經被sleepthread佔了,所以waitthread執行緒只能幹等著。 

等到sleepthread執行緒執行完畢(休眠結束)後釋放了同步鎖,waitthread執行緒拿到了同步鎖,會繼續執行,mwait才會被呼叫。

如果sleepthread釋放了機鎖的話,waitthread 的任務會馬上得到執行。從列印結果可以看出,waitthread 的任務是3秒鐘之後才得到執行。

同步鎖,鎖住的是乙個物件。如果乙個執行緒拿到了乙個物件的機鎖去執行一段同步**塊了,那麼其他執行緒都不能執行這個物件的其他同步**塊。 

在這個例子中就是sleepthread執行緒拿到了service物件的同步鎖,進入後休眠,但沒有釋放機鎖,那麼waitthread執行緒是不能執行這個service物件的其他同步**塊的,也就就是不能進入這一段**

synchronized(this)
相信現在你已經理解了sleep方法沒有釋放機鎖會帶來什麼結果了,那麼繼續wait

wait()是object類的方法,當乙個執行緒執行到wait方法時,它就進入到乙個和該物件相關的等待池,同時釋放物件的機鎖,使得其他執行緒能夠訪問,可以通過notify,notifyall方法來喚醒等待的執行緒

下面修改程式如下所示:

public class service 

catch(exception e)}}

public void mwait()catch(exception e)}}

}

測試類:

public class test

}

同樣先看下列印結果 

這裡是先讓 waitthread執行緒啟動起來,然後waitthread執行緒進入等待狀態,並釋放了service物件的鎖,這時sleepthread也啟動了,來到了msleep方法的同步**塊,因為之前的waitthread執行緒已經釋放了service物件的機鎖,sleepthread可以拿到物件鎖,所以msleep方法是會被馬上呼叫的。然後sleepthread執行緒就是進入了睡眠狀態,等到3秒休眠結束後呼叫notifyall()喚醒了waitthread執行緒。

綜上所訴: 

sleep() 和 wait() 的區別就是 呼叫sleep方法的執行緒不會釋放物件鎖,而呼叫wait() 方法會釋放物件鎖

java中wait 和 sleep 區別

1,wait可以指定時間也可以不指定。sleep必須指定時間。2,在同步中時,對cpu的執行權和鎖的處理不同。wait 釋放執行權,釋放鎖。sleep 釋放執行權,不釋放鎖。public class test1 class mythread extends thread override publi...

Java中wait和sleep區別

super類不同 對於sleep 方法是屬於thread類,而wait 方法,則是屬於object類。是否釋放執行緒鎖 在呼叫sleep 方法的過程中,執行緒不會釋放物件鎖。而當呼叫wait 方法的時候,執行緒會放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件呼叫notify 方法後本執行緒才...

關於JAVA中sleep和wait

腦殼疼,今天傍晚看到sleep和wait時,頭腦中的概念也的確是模糊不清,然後又是一頓搜尋,明白了不少。1.sleep 是屬於thread類,而wait是屬於object類的且必須和notify或notifyall 一起搭配使用。sleep是執行緒控制自身的流程,而wait則屬於執行緒間通訊。該執行...