41. wait notify 方法
阿新 • • 發佈:2018-04-29
spa 其中 implement stat runnable catch while ++ oid
wait() 等待,如果一個線程執行了wait方法,那麽該線程就會進去一個以鎖對象為標識符的線程池中等待
notity() 喚醒,如果一個線程執行了notity方法,那麽就會喚醒以鎖對象為標識符的線程池中等待線程的其中一個(至於喚醒哪一個,不能確定)
notifyAll() 喚醒所有的線程
wait notity的使用註意事項:
1.屬於Object對象的
2.必須要在同步代碼塊或者同步函數中使用
3.必須要由鎖對象調用
4.要想喚醒等待的線程,它們的鎖對象必須一樣,否者無效
代碼實例:
//生產者 消費者 商品,生產一個,就消費一個//產品 class Product{ String name; double price; boolean flag = false;//判斷是否生產完的標誌 } //生產者 class Producer implements Runnable{ Product p; public Producer(Product p) { this.p = p; } @Override public void run() { int i = 0; while(true) {synchronized (p) { if(p.flag == false) { if(i%2 == 0) { p.name = "香蕉"; p.price = 2.0; }else { p.name = "蘋果"; p.price = 6.5; } System.out.println("生產了"+p.name+"價格"+p.price); i++; p.flag = true;//生產完了 p.notify();//喚醒消費者消費 p.notifyAll(); }else { try { p.wait();//產品生產完了等待消費者去消費 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } //消費者 class Customer implements Runnable{ Product p; public Customer(Product p) { this.p = p; } @Override public void run() { while(true) { synchronized (p) { if(p.flag == true) { System.out.println("消費者消費了"+p.name+"花費"+p.price); p.flag = false; p.notify();//喚醒生產者生產 }else { try { p.wait();//消費完了,等待生產者去生產 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } public class Demo9 { public static void main(String[] args) { Product p = new Product(); Producer producer = new Producer(p); Customer customer = new Customer(p); Thread thread1 = new Thread(producer,"生產者"); Thread thread2 = new Thread(customer,"消費者"); thread1.start(); thread2.start(); } }
41. wait notify 方法