Java多執行緒學習筆記(三) wait/notify
阿新 • • 發佈:2018-11-08
1.wait()
- wait()的作用是使當前執行程式碼的執行緒進行等待, 知道接到通知(notify)或者中斷為止
- wait()是Object類的方法
- 當執行緒處於wait,呼叫interrupt()會出現InterruptedException
- 在呼叫wait()之前,執行緒必須獲得該物件的物件級別鎖
- 在呼叫wait()之後,執行緒釋放鎖
- wait(long),等待超過這個時間自動喚醒
2.notify()
- 在呼叫notify()之前,執行緒必須獲得該物件的物件級別鎖
- 在呼叫notify()之後,執行緒不會立刻釋放鎖,要退出synchronized程式碼塊後才會釋放鎖
- 如果有多個執行緒等待,則由執行緒規劃器隨機選1個執行緒,對其發出notify
- 如果要喚醒所有執行緒,使用notifyAll(),可解決多生產者/消費者假死狀態問題
3.實驗wait/notify
3.1 呼叫wait()的執行緒
public class MyThreadOne extends Thread{
private Object lock;
public MyThreadOne(Object lock){
super();
this.lock = lock;
}
@Override
public void run(){
try{
synchronized (lock){
System.out.println("wait begin");
lock.wait();
System.out.println("wait end");
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
3.2 呼叫notify()的執行緒
public class MyThreadTwo extends Thread {
private Object lock;
public MyThreadTwo(Object lock){
super();
this.lock = lock;
}
@Override
public void run(){
synchronized (lock){
System.out.println("notify begin");
lock.notify();
System.out.println("notify end");
}
}
}
3.3 測試類
public class Test {
public static void main(String[] args) {
try{
Object lock = new Object();
MyThreadOne t1 = new MyThreadOne(lock);
t1.start();
Thread.sleep(2000);
MyThreadTwo t2 = new MyThreadTwo(lock);
t2.start();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}