Java 線程間通信案例(生產者和消費者)

(1)主函數

/**
 * 生產者消費者模式:
 * 生產者判斷state是否爲true,若爲true則表示有包子,生產者休眠,等待消費者拿到true的狀態進行消費;
 *                          若不爲true說明現在沒有包子,則生產包子,並將狀態置爲true,之後,將消費者喚醒。
 * 消費者判斷狀態是否爲false,若爲false則說明沒有包子,消費者睡眠,等待生產者拿到false的狀態開始生產;
 *                          若不爲false則說明有包子,消費者進行消費,並將狀態置位false,之後將生產者喚醒。
 */
public class BaoZiDemo {
    public static void main(String[] args) {
        BaoZI baoZI = new BaoZI();
        Product product = new Product(baoZI);
        Consumer consumer = new Consumer(baoZI);
        new Thread(product).start();//生產者線程
        new Thread(consumer).start();//消費者線程
    }
}

(2)包子對象

public class BaoZI {
    private String pi;
    private String xian;
    private boolean state=false;

    public BaoZI() {
    }

    public BaoZI(String pi, String xian, boolean state) {
        this.pi = pi;
        this.xian = xian;
        this.state = state;
    }

    public String getPi() {
        return pi;
    }

    public void setPi(String pi) {
        this.pi = pi;
    }

    public String getXian() {
        return xian;
    }

    public void setXian(String xian) {
        this.xian = xian;
    }
    public boolean getState() {
        return state;
    }

    public void setState(boolean state) {
        this.state = state;
    }
}

(3)生產者線程實現類

public class Product implements Runnable {
    private BaoZI bz;//鎖對象,控制同步代碼塊

    public Product(BaoZI bz) {
        this.bz = bz;
    }

    @Override
    public void run() {
        while (true){
            synchronized (bz){
                if(bz.getState()){//爲true表示現在有包子
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else{
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("生產一個包子");

                    bz.setState(true);
                    bz.notify();
                }

            }
        }
    }
}

(4)消費者線程實現類

public class Consumer implements Runnable {
    private BaoZI bz;//鎖對象,控制同步代碼塊

    public Consumer(BaoZI bz) {
        this.bz = bz;
    }
    @Override
    public void run() {
        while(true){
            synchronized (bz){
                if(!bz.getState()){//狀態爲false,表示沒有包子
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else{
                    System.out.println("消費者使用包子");
                    bz.setState(false);
                    bz.notify();
                }
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章