Java多線程中wait和sleep的區別

Java多線程中wait和sleep的區別

如果你瞭解過Java的多線程,一定知道如果讓線程暫停可以通過wait或者sleep來完成,但是二者的區別又是什麼呢。其實他們的主要區別是wait在暫停的時候會釋放鎖,而sleep不會釋放鎖,下面以代碼給大家演示一下二者的不同之處。

public class Wait_and_Sleep{
    public static void main(String[] args) {
        Object lock = new Object();
        new Thread(new Runnable(){
            @Override
            public void run(){
                synchronized(lock){
                    System.out.println("thread1 get lock");
                    try{
                        Thread.sleep(2000);
                    }catch(Exception e){}
                }
            }
        }).start();

        new Thread(new Runnable(){
            @Override
            public void run(){
                synchronized(lock){
                    System.out.println("thread2 get lock");                    
                }
            }
        }).start();
    }
}

上面的代碼是利用sleep進行暫停的,終端的輸出如下,在thread1得到鎖後2秒才輸出thread2,說明線程1在sleep的時候並沒有釋放鎖。

thread1 get lock
thread2 get lock

我們將代碼稍微改動一下,將sleep修改爲wait:

public class Wait_and_Sleep{
    public static void main(String[] args) {
        Object lock = new Object();
        new Thread(new Runnable(){
            @Override
            public void run(){
                synchronized(lock){
                    System.out.println("thread1 get lock");
                    try{
                        lock.wait();
                    }catch(Exception e){}
                }
            }
        }).start();

        new Thread(new Runnable(){
            @Override
            public void run(){
                synchronized(lock){
                    System.out.println("thread2 get lock");
                    // lock.notifyAll();
                }
            }
        }).start();
    }
}

上面的代碼是利用wait進行暫停的,終端的輸出如下,和上面不同的是,當thread1進入wait以後,thread2立刻就執行了,說明thread1將鎖釋放掉了。

thread1 get lock
thread2 get lock

另外需要注意的是,如果線程2中lock.notifyAll()是註釋的話,那麼線程1會陷入阻塞,因爲沒有被喚醒,只有加入了notifyAll(),纔會被喚醒,然後重新拿鎖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章