天天看點

wait、notify、notifyAll的阻塞和恢複

(一)準備

(二)阻塞和恢複

(1)wait方法

wait、notify、notifyAll的阻塞和恢複
wait、notify、notifyAll的阻塞和恢複
wait、notify、notifyAll的阻塞和恢複
wait、notify、notifyAll的阻塞和恢複

  阻塞:這三個方法的調用都會使目前線程阻塞。該線程将會被放置到對該Object的請求等待隊列中,然後讓出目前對Object所擁有的所有的同步請求。線程會一直暫停所有線程排程,直到下面其中一種情況發生:

    ① 其他線程調用了該Object的notify方法,而該線程剛好是那個被喚醒的線程;

    ② 其他線程調用了該Object的notifyAll方法;

    ③ 其他對象中斷/殺死了該線程;

    ④ (這種情況,隻針對前兩個方法)線程在等待指定的時間後;

  恢複:線程将會從等待隊列中移除,重新成為可排程線程。它會與其他線程以正常的方式競争對象同步請求。一旦它重新獲得對象的同步請求,所有之前的請求狀态都會恢複,也就是線程調用wait的地方的狀态。線程将會在之前調用wait的地方繼續運作下去。

(2)notify和notifyAll方法

  notify的作用就是喚醒請求隊列中的一個線程,而notifyAll喚醒的是請求隊列中的所有線程。

  被喚醒的線程不會馬上運作,除非擷取了該Object的鎖。也就是說,調用notify的線程,在調用notify後,不會像wait一樣,馬上阻塞線程的運作。而是繼續運作,直到相應的線程排程完成或者讓出Object的鎖。而被喚醒的線程會在目前線程讓出Object鎖後,與其他線程以正常的方式競争對象鎖(正如上面提到的)。

參考資料:

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

wait、notify、notifyAll的阻塞和恢複
wait、notify、notifyAll的阻塞和恢複

本文轉自農夫山泉别墅部落格園部落格,原文連結:http://www.cnblogs.com/yaowen/p/6141807.html,如需轉載請自行聯系原作者