Java Thread 類相關的幾個核心方法

weixin_34208283發表於2018-08-11
問:簡單說說 Thread 的 sleep() 和 yield() 方法的區別?

答:它們的主要區別如下:

  • sleep() 方法給其他執行緒執行機會時不考慮執行緒的優先順序,因此會給低優先順序的執行緒以執行的機會;而 yield() 方法只會給相同優先順序或更高優先順序的執行緒以執行的機會,甚至可能會是自己繼續得到執行機會。

  • 執行緒執行 sleep() 方法後轉入阻塞(blocked)狀態,而執行 yield() 方法後轉入就緒(ready)狀態。

  • sleep() 方法宣告丟擲 InterruptedException,而 yield() 方法沒有宣告任何異常。

  • sleep() 方法比 yield() 方法(跟作業系統 CPU 排程相關)具有更好的可移植性。

問:簡單說說 Thread 的 join() 和 yield() 方法的區別?

答:它們的主要區別如下。

  • join() 方法的作用是讓 “主執行緒” 等待 “子執行緒” 結束之後才能繼續執行。

  • yield() 方法的作用是可以暫停當前正在執行的執行緒物件,讓其它有相同優先順序或更高的執行緒執行。它是一個靜態方法而且只保證當前執行緒放棄 CPU 佔用而不能保證使其它執行緒一定能佔用 CPU,執行 yield() 的執行緒有可能在進入到暫停狀態後馬上又被執行。

問:為什麼應該在迴圈中檢查執行緒的等待條件(如下程式碼)?
synchronized (monitor) {
    //  判斷條件謂詞是否得到滿足
    while(!locked) {
        //  等待喚醒
        monitor.wait();
    }
    //  處理其他的業務邏輯
}

答:我們一般都會使用如上的 while 判斷,而不採用如下的 if 判斷:

synchronized (monitor) {
    //  判斷條件謂詞是否得到滿足
    if(!locked) {
        //  等待喚醒
        monitor.wait();
    }
    //  處理其他的業務邏輯
}

這是因為如果採用 if 判斷,當執行緒從 wait 中喚醒時將直接執行處理其他業務邏輯的程式碼,但這時候可能出現另外一種可能,條件謂詞已經不滿足處理業務邏輯的條件了,從而出現錯誤的結果,於是有必要進行再一次判斷。

本文參考自 Java 中 Thread 類相關的幾個核心方法題目解析

相關文章