


成都java開發培訓
達內成都高升橋中心
一、方法介紹
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();
}
/