在Java的高級(jí)編程中,有兩個(gè)十分重要的方法——sleep()和wait()。下面將簡(jiǎn)單介紹它們的用法和區(qū)別:
public void sleep(long millis) throws InterruptedException
sleep()方法可以讓當(dāng)前線程休眠指定時(shí)間,時(shí)間以毫秒為單位。例如:
Thread.sleep(1000) //休眠1秒
在執(zhí)行完以上代碼后,當(dāng)前線程將不會(huì)執(zhí)行任何操作,等待1秒鐘后才會(huì)從sleep()返回繼續(xù)執(zhí)行。
與sleep()方法不同的是,wait()方法需要在監(jiān)視器對(duì)象上調(diào)用:
public final void wait() throws InterruptedException public final void wait(long timeout) throws InterruptedException public final void wait(long timeout, int nanos) throws InterruptedException
wait()方法的作用是使當(dāng)前線程進(jìn)入等待狀態(tài),直到該監(jiān)視器對(duì)象被喚醒,或者等待時(shí)間到達(dá)指定的時(shí)間為止。
比如:
synchronized (obj) { obj.wait(); }
執(zhí)行以上代碼后,線程將進(jìn)入obj對(duì)象的等待隊(duì)列中。在其他線程調(diào)用obj.notify()或obj.notifyAll()之前,該線程都將一直處于等待狀態(tài)。
需要注意的是,wait()方法必須在synchronized塊里面被調(diào)用。如果沒有鎖定監(jiān)視器對(duì)象,則會(huì)拋出IllegalMonitorStateException。此外,喚醒線程的操作也必須在synchronized塊內(nèi)進(jìn)行。
綜上所述,sleep()方法是線程本身的方法,可以讓當(dāng)前線程休眠,并不會(huì)釋放鎖,因此其他線程還可以訪問(wèn)該鎖;而wait()方法是Object的方法,可以讓當(dāng)前線程進(jìn)入對(duì)象的等待隊(duì)列中,并釋放鎖,直到被其他線程喚醒或者等待時(shí)間到達(dá)指定的時(shí)間為止。