一、方法介紹
1、void wait()
使得線程進入等待狀態,直到它被其他線程通過notify()或者notifyAll喚醒。該方法只能在同步方法(void synchronized methodName( args... ){ ... })或者 “同步塊內部“ (synchronized(object){ ... })被調用。如果當前線程不是鎖的持有者,該方法會拋出一個IllegalMonitorStateException異常。
即如果鎖住的是object,那麼你只能調用object的wait()方法。
2、void notify()
隨機選擇一個在該對象上調用wait方法的線程,解除其阻塞狀態。該方法只能在同步方法(void synchronized methodName( args... ){ ... })或者 “同步塊內部“ (synchronized(object){ ... })被調用。如果當前線程不是鎖的持有者,該方法會拋出一個IllegalMonitorStateException異常。
3、void notifyAll()
解除所有那些在該對象上調用wait方法的線程的阻塞狀態。該方法只能在同步方法(void synchronized methodName( args... ){ ... })或者 “同步塊內部“ (synchronized(object){ ... })被調用。如果當前線程不是鎖的持有者,該方法會拋出一個IllegalMonitorStateException異常。
二、范例講解( 注意測試類A只能聲明為外部類,下面代碼在 class A 和 main方法 之間 省略了MainClass { ... } )
1、“同步塊”測試
(1)加synchronized(){}
class A{} public static void main(String[] args) { A object = new A(); System.out.println("Main Thread Id = " + Thread.currentThread().getId()); synchronized (object) { try { System.out.println("This Thread Id = " + Thread.currentThread().getId()); object.wait(); } catch (InterruptedException e) { </span>e.printStackTrace(); } } }
輸出
(2)不加synchronized(){}
class A{} public static void main(String[] args) { A object = new A(); System.out.println("Main Thread Id = " + Thread.currentThread().getId()); //synchronized (object) { try { </span>System.out.println("This Thread Id = " + Thread.currentThread().getId()); </span>object.wait(); } catch (InterruptedException e) { </span>e.printStackTrace(); } /
URL:http://www.bianceng.cn/Programming/Java/201608/50367.htm