wait 1000 與sleep 1000 的區別

2021-10-01 05:14:34 字數 644 閱讀 5937

sleep和wait的區別:

1、sleep是thread的靜態方法,wait是object的方法,任何物件例項都能呼叫。

2、sleep不會釋放鎖,它也不需要占用鎖。wait會釋放鎖,但呼叫它的前提是當前執行緒占有鎖(即**要在synchronized中)。

3、它們都可以被interrupted方法中斷。

具體來說:

thread.sleep(1000) 意思是在未來的1000毫秒內本執行緒不參與cpu競爭,1000毫秒過去之後,這時候也許另外乙個執行緒正在使用cpu,那麼這時候作業系統是不會重新分配cpu的,直到那個執行緒掛起或結束,即使這個時候恰巧輪到作業系統進行cpu 分配,那麼當前執行緒也不一定就是總優先順序最高的那個,cpu還是可能被其他執行緒搶占去。另外值得一提的是thread.sleep(0)的作用,就是觸發作業系統立刻重新進行一次cpu競爭,競爭的結果也許是當前執行緒仍然獲得cpu控制權,也許會換成別的執行緒獲得cpu控制權。

wait(1000)表示將鎖釋放1000毫秒,到時間後如果鎖沒有被其他執行緒占用,則再次得到鎖,然後wait方法結束,執行後面的**,如果鎖被其他執行緒占用,則等待其他執行緒釋放鎖。注意,設定了超時時間的wait方法一旦過了超時時間,並不需要其他執行緒執行notify也能自動解除阻塞,但是如果沒設定超時時間的wait方法必須等待其他執行緒執行notify。

關於「Sleep 1 」呼叫的問題

因為在專案中有很多定時的任務,而這些任務一般又是比較費時的任務,所以不方便在主線程中用視窗定時器來實現,因為這樣有可能會阻塞介面,從而導致介面卡頓。另外,用視窗定時器也導致邏輯 與介面 耦合。所以實現了乙個簡單的定時任務幫浦,其實現原理是這樣的。首先,封裝了乙個任務基類,其中有乙個do虛方法。各種實...

深入分析Sleep 0 與Sleep 1 的區別

深入分析sleep 0 與sleep 1 的區別 羅朝輝 目的 有時候我們想讓執行緒不被排程一定的時間,也就是說讓執行緒睡眠一段時間。api 介面 在 win32中可以呼叫 sleep,sleepex 和 switchtothread 三個api。void winapi sleep dword dw...

深入分析Sleep 0 與Sleep 1 的區別

深入分析sleep 0 與sleep 1 的區別 羅朝輝 目的 有時候我們想讓執行緒不被排程一定的時間,也就是說讓執行緒睡眠一段時間。api 介面 在 win32中可以呼叫 sleep,sleepex 和 switchtothread 三個api。void winapi sleep dword dw...