1. 程式人生 > >執行緒sleep和物件wait一段時間的區別

執行緒sleep和物件wait一段時間的區別

它們的區別主要考慮兩點:1.cpu是否繼續執行、2.鎖是否釋放掉。

對於這兩點,首先解釋下cpu是否繼續執行的含義:cpu為每個執行緒劃分時間片去執行,每個時間片時間都很短,cpu不停地切換不同的執行緒,以看似他們好像同時執行的效果。

其次解釋下鎖是否釋放的含義:鎖如果被佔用,那麼這個執行程式碼片段是同步執行的,如果鎖釋放掉,就允許其它的執行緒繼續執行此程式碼塊了。

明白了以上兩點的含義,開始分析sleep和wait:

sleep一段時間之後,往往執行緒會立即執行,可見cpu一直在為此執行緒分配時間片,如果外層包有Synchronize,那麼此鎖並沒有釋放掉。因此sleep cpu繼續執行、鎖並沒有釋放掉;

wait,一般用於鎖機制中,肯定是要釋放掉鎖的,因為notify並不會立即調起此執行緒,因此cpu是不會為其分配時間片的,也就是說wait 執行緒進入等待池,cpu不分時間片給它,鎖釋放掉。

以上只是理論上,下面用程式碼進行嘗試:

/**
 * Created by lizhiqiang on 2016/12/23.
 */
public class testSleep {
    public static void main(String[] args){
        new Thread(new Runnable() {
            @Override
public void 
run() { synchronized (this){ try { Thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }
/**
 * Created by lizhiqiang on 2016/12/23.
*/ public class testWait { public static void main(String[] args){ new Thread(new Runnable() { @Override public void run() { synchronized (this){ try { this.wait(100000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }
執行結果:

testSleep有一個執行緒進入睡眠態,testWait有一個執行緒進入等待態。

cpu均進入0%(均有偶爾1%的情況)。

IO操作:sleep的IO操作比wait的IO操作要少,應該是wait的時候將上下文進行儲存導致。