1. 程式人生 > 實用技巧 >Object.wait()實現生產者消費者模式

Object.wait()實現生產者消費者模式

主呼叫程式:

public class MainDemo {
    public static void main(String[] args) {
        Box box=new Box();

        Product product=new Product(box);
        Customer customer =new Customer(box);

        Thread th1=new Thread(product);
        Thread th2=new Thread(customer);

        th1.start();
        th2.start();

    }
}

共享資源類:

/*
* 共享資料區
* */
public class Box {
    private int milk;
    private boolean state=false;

    /*
    * 加鎖呼叫
    * */
    public synchronized void put(int milk)
    {
        if (state){
            try {
                /* 事件鎖:
                * 1.不帶引數:導致當前執行緒等待,直到另一個執行緒呼叫該物件的 notify()方法或 notifyAll()方法。
                * 2.帶引數過載:導致當前執行緒等待,直到另一個執行緒呼叫該物件的 notify()方法或 notifyAll()方法,或指定的時間已過。
                * 
*/ wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.milk=milk; System.out.println("放入:"+this.milk); this.state=true; /* * 喚醒正在等待物件監視器的所有執行緒。 * */ notifyAll(); }
public synchronized void get(){ if (!state){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("取出:"+milk); state=false; notifyAll(); } }

生產者:

/*
* 生產者類
* */
public class Product implements Runnable {
    private Box box;

    public Product(Box box) {
        this.box = box;
    }

    @Override
    public void run() {
        for (int i=1;i<11;i++){
            box.put(i);
        }
    }
}

消費者:

/*
* 消費者類
* */
public class Customer implements Runnable {
    private Box box;

    public Customer(Box box) {
        this.box = box;
    }

    @Override
    public void run() {
        while (true){
            box.get();
        }
    }
}