線程通知和等待

wait() 等待(阻塞)線程

  1. wait() 方法調用前須要先獲取到該對象監視器鎖,不然會拋出 IllegalMonitorStateException 異常;
synchronized(共享變量) {
      // dosomething
}
synchronized void method(int a, int b) {
      // dosomething
}
  1. 當(1)調用了該共享變量的 notify() 或者 notifyAll() 方法,(2)其餘線程調用了該線程的 interrupt() 方法,該線程拋出 InterruptException 異常,都會使線程返回。
  2. wait() 會釋放共享變量上的鎖。

虛假喚醒

  1. 一個線程在沒有被其餘線程調用 notify() notifyAll() 方法進行通知,或者被中斷,或者等待超時,線程從掛在狀態變爲了能夠運行狀態(被喚醒),這就是所謂的虛假喚醒。
    在條件循環中調用 wait() 方法進行虛假喚醒的防範
synchronized (obj) {
    whiel(條件) {
        obj.wait();
    }
}
  1. wait(long timeout) timeout時間內沒有被其餘線程調用該共享變量的 notify() notifyAll() 方法喚醒,那麼就會超時返回。

notify() notifyAll()

notify()wait() 同樣,若是沒有獲取共享變量的監視器鎖,調用共享變量的 notify() 方法就會拋出 IllegalMonitorStateException 異常。java

join() 等待線程執行終止

線程A 調用 線程B 的 join() 方法會阻塞線程B ,等待線程A執行完成返回。線程

sleep(long time)

當一個線程調用了 Threadsleep 方法,調用線程會暫時讓出指定時間執行權,也就是這個期間不參與CPU的調度,可是線程持有的監視器資源(好比鎖)不讓出。code

Thead.yield()

調用 yield() 方法的線程會讓出本身剩餘的時間片,並處於就緒狀態,並不會阻塞掛起,等待線程調用器的下一次調度。對象

interrupt() isInterrput() interrupted()

  1. interrupt() 將線程的中斷標誌設置爲 true,若是該線程由於調用 wait() join() 或者 sleep() 等方法被阻塞掛起,該線程會在調用這些方法的地方拋出 InterruptedException 異常方法。
  2. isInterrupted() 檢測當前顯示是否被中斷,是返回 true, 不然返回 false。
  3. interrupted() 這個是個靜態方法,若是線程被中斷了,返回true, 不然返回false,若是發現線程被中,則會清除中斷標誌。
相關文章
相關標籤/搜索