Java中的sleep和wait是常用的阻塞操作。它們可以讓線程暫停一段時間或等待某個特定條件發(fā)生。
sleep方法可以讓當前線程暫停一段指定的時間。我們可以使用Thread.sleep()方法來調(diào)用,它需要傳入一個long類型的參數(shù),表示暫停的時間,單位是毫秒。
try { Thread.sleep(1000); //暫停1秒 } catch (InterruptedException e) { e.printStackTrace(); }
wait方法則比較復(fù)雜,它需要和synchronized關(guān)鍵字一起使用。當一個對象上調(diào)用wait()方法時,它會讓當前線程進入該對象的等待隊列中,并釋放該對象的鎖。當該對象上的某個線程調(diào)用notify()或notifyAll()方法時,等待隊列中的線程將被喚醒,繼續(xù)競爭該對象的鎖。
synchronized(obj) { while (!condition) { //條件不滿足時 try { obj.wait(); //阻塞線程并釋放鎖 } catch (InterruptedException e) { e.printStackTrace(); } } }
在使用wait時,我們通常會使用while循環(huán)來檢測條件,以避免線程被誤喚醒的情況。而且,我們還需要在wait方法外再套一層synchronized同步塊,以確保在調(diào)用wait之前,該對象的鎖已經(jīng)被獲取。