Java是一種非常流行的編程語言,其中的sleep和wait方法是常用的用來暫停線程的方法。這些方法對于實現一些并發操作是非常有用的。
sleep方法是Thread類的一個靜態方法,它可以讓當前線程進入休眠狀態一段時間。這個時間是以毫秒為單位的,并且這個線程將被暫停執行,直到指定的時間過去。
public static native void sleep(long millis) throws InterruptedException
wait方法是Object類的一個方法,它可以使線程進入等待狀態,直到另一個線程調用了這個對象的notify或者notifyAll方法。
public final void wait() throws InterruptedException public final native void wait(long timeout) throws InterruptedException public final native void wait(long timeout, int nanos) throws InterruptedException
這兩個方法都會暫停當前線程的執行,但是有一些重要的區別。首先,wait方法必須在同步塊中調用,因為它需要獲得對象的鎖。而sleep方法不需要,它可以在任何地方調用。其次,wait方法會釋放對象的鎖,而sleep方法不會釋放鎖。這意味著在使用wait方法時,其他線程可以進入這個對象的同步塊,而在使用sleep方法時,其他線程無法進入同步塊。
關于CPU的使用,這兩個方法也有不同的影響。當一個線程調用sleep方法時,它會立即釋放CPU,讓其他線程可以使用CPU。但是當一個線程調用wait方法時,它會釋放CPU和對象的鎖,這意味著其他線程可以進入同步塊和使用CPU。當notify或者notifyAll方法被調用時,等待的線程才會被喚醒。
在實踐中,使用wait方法通常比sleep方法更有效,因為它可以避免使用CPU。但是在某些情況下,使用sleep方法可能更合適,比如要在中國和美國兩個時區之間進行等待的時候。