1. 程式人生 > >41. wait notify 方法

41. wait notify 方法

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 方法