Java中的wait和sleep都是用于線程控制的方法。
wait()是Object類中的方法,可以讓當前線程等待,直到其他線程調用notify()或notifyAll()方法喚醒它。
public synchronized void wait() throws InterruptedException
wait()方法必須在同步代碼塊中被調用,否則會拋出IllegalMonitorStateException異常。例如,以下代碼就是合法的:
synchronized(sharedObject) { // some code sharedObject.wait(); // more code }
該代碼塊獲取了sharedObject對象的鎖,然后在該對象上等待,直到其他線程調用notify()或notifyAll()方法喚醒它。
與之相反,sleep()方法讓當前線程休眠,但不釋放鎖。例如:
try { Thread.sleep(1000); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); }
這個代碼片段會讓當前線程休眠1秒鐘,但不釋放鎖。如果在等待時該線程被其他線程中斷,則會拋出InterruptedException異常。在這種情況下,需要在catch塊中再次調用Thread.currentThread().interrupt()方法來恢復線程的中斷狀態。