Java中的線程是如何控制自己的行為的呢?我們知道,在Java中,線程有兩種控制方式,分別是wait()和sleep()。
public static synchronized void wait() throws InterruptedException public static native void sleep(long millis) throws InterruptedException
wait()方法和sleep()方法都是用來控制線程的執行流程的,但是它們的功能不太一樣。
wait()方法是讓當前線程進入等待狀態,直到其它線程調用notify()或notifyAll()方法喚醒它。wait()方法既可以在synchronized方法內調用,也可以在synchronized塊內調用。調用wait()方法后,當前線程將釋放鎖,進入等待狀態,直到其它線程調用notify()或notifyAll()方法喚醒它,或者時間到期。
synchronized (obj) { while (condition) { obj.wait(); } // ... }
sleep()方法是讓當前線程進入休眠狀態,休眠時間結束后會重新進入就緒狀態,等待系統重新調度。sleep()方法只能在synchronized方法內或synchronized塊內調用,否則會拋出IllegalMonitorStateException異常。
synchronized (obj) { while (condition) { try { obj.wait(); } catch (InterruptedException e) { // ... } } // ... }
總之,wait()和sleep()方法雖然都是控制線程的執行流程的方法,但是它們的作用不同。wait()方法讓線程進入等待狀態,等待其它線程喚醒;sleep()方法讓線程進入休眠狀態,等待時間到期后重新進入就緒狀態。開發者需要根據具體的需求,在使用兩種方法時選擇恰當的方式,才能實現適合自己需求的程序。