wait()
方法調用前須要先獲取到該對象監視器鎖,不然會拋出 IllegalMonitorStateException
異常;synchronized(共享變量) { // dosomething } synchronized void method(int a, int b) { // dosomething }
notify()
或者 notifyAll()
方法,(2)其餘線程調用了該線程的 interrupt()
方法,該線程拋出 InterruptException
異常,都會使線程返回。wait()
會釋放共享變量上的鎖。notify()
notifyAll()
方法進行通知,或者被中斷,或者等待超時,線程從掛在狀態變爲了能夠運行狀態(被喚醒),這就是所謂的虛假喚醒。wait()
方法進行虛假喚醒的防範synchronized (obj) { whiel(條件) { obj.wait(); } }
notify()
notifyAll()
方法喚醒,那麼就會超時返回。notify()
和 wait()
同樣,若是沒有獲取共享變量的監視器鎖,調用共享變量的 notify()
方法就會拋出 IllegalMonitorStateException
異常。java
線程A 調用 線程B 的 join()
方法會阻塞線程B ,等待線程A執行完成返回。線程
當一個線程調用了 Thread
的 sleep
方法,調用線程會暫時讓出指定時間執行權,也就是這個期間不參與CPU的調度,可是線程持有的監視器資源(好比鎖)不讓出。code
調用 yield()
方法的線程會讓出本身剩餘的時間片,並處於就緒狀態,並不會阻塞掛起,等待線程調用器的下一次調度。對象
interrupt()
將線程的中斷標誌設置爲 true,若是該線程由於調用 wait()
join()
或者 sleep()
等方法被阻塞掛起,該線程會在調用這些方法的地方拋出 InterruptedException
異常方法。isInterrupted()
檢測當前顯示是否被中斷,是返回 true, 不然返回 false。interrupted()
這個是個靜態方法,若是線程被中斷了,返回true, 不然返回false,若是發現線程被中,則會清除中斷標誌。