剛上市就取消優惠,訊息稱小鵬汽車將調整每年 3000 度免費充電額度
阿新 • • 發佈:2021-07-10
生產者消費者模式
等待和喚醒
public final void wait():導致當前執行緒等到另一個執行緒呼叫該物件的notify()方法或notifyAll()方法。
public final void notify():喚醒正在等待物件監視器的單個執行緒。
public final void notifyAll():喚醒正在等待物件監視器的所有執行緒。
package com.thread.demo; //1.奶箱類 public class Box { //定義一個成員變數,表示第x瓶奶 private int milk; //定義一個成員變數,表示奶箱的狀態 private boolean state = false; //提供儲存牛奶和提取牛奶的操作 public synchronized void put(int milk) { //如果有牛奶,等待消費 if (state) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果沒有牛奶,就生產牛奶 this.milk = milk; System.out.println("送奶工將第" + this.milk + "瓶奶放入奶箱"); //生產完畢之後,修改奶箱狀態 state = true; //喚醒其他等待的執行緒 notifyAll(); } public synchronized void get() { //如果沒有牛奶,等待生產 if (!state) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果有牛奶,就消費牛奶 System.out.println("使用者拿到第" + this.milk + "瓶奶"); //消費完畢之後,修改奶箱狀態 state = false; //喚醒其他等待的執行緒 notifyAll(); } }
package com.thread.demo;
//2.生產者類
public class Producer implements Runnable {
private Box b;
public Producer(Box b) {
this.b = b;
}
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
b.put(i);
}
}
}
package com.thread.demo; //3.消費者類 public class Customer implements Runnable { private Box b; public Customer(Box b) { this.b = b; } @Override public void run() { while (true){ b.get(); } } }
package com.thread.demo; //4.測試類 public class BoxDemo { public static void main(String[] args) { //建立奶箱物件 Box b = new Box(); //建立生產者物件 Producer p = new Producer(b); //建立消費者物件 Customer c = new Customer(b); //建立2個執行緒 Thread t1 = new Thread(p); Thread t2 = new Thread(c); //啟動執行緒 t1.start(); t2.start(); } }