wait();notify();簡單例子

public class Test1{ide

/**
* @param args
*/
public static void main(String[] args) {
new Thread(new Thread1()).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new Thread2()).start();
}this

private static class Thread1 implements Runnable {線程

@Override
public void run() {
// 因爲這裏的Thread1和下面的Thread2內部run方法要用同一對象做爲監視器,咱們這裏不能用this,由於在Thread2裏面的this和這個Thread1的this不是同一個對象。咱們用MultiThread.class這個字節碼對象,當前虛擬機裏引用這個變量時,指向的都是同一個對象。
synchronized (Test1.class) {對象

System.out.println("enter thread1...");
System.out.println("thread1 is waiting");
try {
// 釋放鎖有兩種方式,第一種方式是程序天然離開監視器的範圍,也就是離開了synchronized關鍵字管轄的代碼範圍,另外一種方式就是在synchronized關鍵字管轄的代碼內部調用監視器對象的wait方法。這裏,使用wait方法釋放鎖。
Test1.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}虛擬機

System.out.println("thread1 is going on...");
System.out.println("thread1 is being over!");
}
}it

}io

private static class Thread2 implements Runnable {class

@Override
public void run() {
synchronized (Test1.class) {thread

System.out.println("enter thread2...");
System.out.println("thread2 notify other thread can release wait status..");
// 因爲notify方法並不釋放鎖,
// 即便thread2調用下面的sleep方法休息了10毫秒,但thread1仍然不會執行,由於thread2沒有釋放鎖,因此Thread1沒法得不到鎖。
//notify並不釋放鎖,只是告訴調用過wait方法的線程能夠去參與得到鎖的競爭了,但不是立刻獲得鎖,由於鎖還在別人手裏,別人還沒釋放。若是notify方法後面的代碼還有不少,須要這些代碼執行完後纔會釋放鎖
Test1.class.notify();
System.out.println("thread2 is sleeping ten millisecond...");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2 is going on...");
System.out.println("thread2 is being over!");
}
}變量

} }

相關文章
相關標籤/搜索