1. 程式人生 > 資訊 >剛上市就取消優惠,訊息稱小鵬汽車將調整每年 3000 度免費充電額度

剛上市就取消優惠,訊息稱小鵬汽車將調整每年 3000 度免費充電額度

生產者消費者模式

等待和喚醒

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();
    }

}