天天看點

線程同步 wait()、notify()

很重要的概念。

多線程通路同一段代碼,不會産生不确定的結果。則可以說這段代碼是線程安全的。

調用sleep()的時候,鎖并沒有被釋放,調用yield()也屬于這種情況;而wait()方法會将鎖釋放。

隻能在同步控制方法或同步控制塊裡面調用 wait()、notify()、notifyall()。如果在非同步控制塊中調用這些方法,能通過編譯但運作會出錯,得到illegalmonitorstateexception異常。

當調用某個executorservice的shutdownnow()時,它會調用 所有 由它控制的 線程的interrupt()。

thread.yield()告訴java線程排程器“重要的部分我已經完成,此刻可以将我挂起,切換給其他線程執行”。這個函數可用可不用,但用了它更容易按照自己的掌控去切換線程,進而驗證一些東西。

調用wait()時,執行兩個動作:挂起線程,釋放鎖。

别的地方調用notifyall(),将喚醒wait()所挂起的線程。線上程繼續運作之前将重新獲得上次wait()調用時釋放的鎖。

使用notify()時,在衆多等待同一個鎖的任務中隻有一個會被喚醒。

notifyall()喚醒所有等待同一個鎖的任務。注意,這并不意味着在程式的任何地方,任何被wait()挂起的線程都會被喚醒,。當notifyall()因為某個特定鎖而被調用時,隻有等待這個鎖的任務才會被喚醒。

線程同步 wait()、notify()

打蠟、抛光在多個線程中交替進行。

需要一個狀态切換的标志位,兩對wait()、notify()操作。

一:thinking in  java 的例子

調試時可以看到有三個線程,很直覺。

線程同步 wait()、notify()

二:自己改造,wait() notify()全放在car類中處理