【線程】 Thread.sleep 與 Object.wait 的區別 (三)

我的原則:先會用再說,內部慢慢來


Thread.sleep 與 Object.wait 的區別

1. 作用

  1. Thread.sleep 的作用是啥:當前thread睡覺,讓出資源。(但是不釋放鎖)
  2. Object.wait 作用是啥:當前 thread讓出資源。(釋放鎖)

2. 注意點

  1. 記住鎖是鎖對象,不是鎖住線程

3. 代碼Demo

public class _04_SleepTest {
    /*
        這裏加入 synchronized 的目的,就是爲了看下 sleep 的時候,釋放不釋放鎖
     */
    public synchronized void sleepMethod() throws Exception {
        System.out.println(Thread.currentThread().getName() + ",Sleep start-----");
        Thread.sleep(1000);
        System.out.println(Thread.currentThread().getName() + ",Sleep end-----");
    }

    public synchronized void waitMethod() throws Exception {
        System.out.println(Thread.currentThread().getName() + ",Wait start-----");
        wait(1000);
        System.out.println(Thread.currentThread().getName() + ",Wait end-----");
    }

    public static void main(String[] args) throws Exception {
        final _04_SleepTest test1 = new _04_SleepTest();

        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                try {
                    test1.sleepMethod();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }

        Thread.sleep(10000);//暫停十秒,等上面程序執行完成
        System.out.println("-----分割線-----");

        final _04_SleepTest test2 = new _04_SleepTest();

        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                try {
                    test2.waitMethod();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

輸出:

Thread-0,Sleep start-----
Thread-0,Sleep end-----
Thread-2,Sleep start-----
Thread-2,Sleep end-----
Thread-1,Sleep start-----
Thread-1,Sleep end-----
-----分割線-----
Thread-3,Wait start-----
Thread-4,Wait start-----
Thread-5,Wait start-----
Thread-3,Wait end-----
Thread-5,Wait end-----
Thread-4,Wait end-----

流程:
1. 通過sleep方法實現的暫停,程序是順序進入同步塊的,只有當上一個線程執行完成的時候,下一個線程才能進入同步方法,sleep暫停期間一直持有monitor對象鎖,其他線程是不能進入的。
2. wait方法則不同,當調用wait方法後,當前線程會釋放持有的monitor對象鎖,
因此,其他線程還可以進入到同步方法,線程被喚醒後,需要競爭鎖,獲取到鎖之後再繼續執行。

4. 結論

最簡單的區別是,wait方法依賴於同步,而sleep方法可以直接調用。
而更深層次的區別在於sleep方法只是暫時讓出CPU的執行權,並不釋放鎖。而wait方法則需要釋放鎖。	

5. 番外篇

下一章節:【線程】 Thread.yeild 內部原理 (四)
上一章節:【線程】 Object.wait 內部原理(二)

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