生產(chǎn)者和消費(fèi)者問題

生產(chǎn)者和消費(fèi)者是操作系統(tǒng)中的一個經(jīng)典問題,這個問題是在講“進(jìn)程同步”時的一個例子,下面我就用Java語言中的notify和wait關(guān)鍵字實(shí)現(xiàn)這個算法。

生產(chǎn)者

/**
 * Description: 生產(chǎn)者.
 *
 * @author: crane-yuan
 */
public class Producer extends Thread
{
    static final int MAXQUEUE = 10;
    private Vector   messages = new Vector();
    /**
     * Description:
     *
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
        try {
            while (true) {
                putMessage();
                sleep(1500);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    private synchronized void putMessage() throws InterruptedException {
        while (messages.size() == MAXQUEUE) {
            wait();
        }
        messages.add(new Date().toLocaleString());
        System.out.println("put message...");
        notify();
    }
    //Called by Consumer
    public synchronized String getMessage() throws InterruptedException {
        notify();
        while (messages.size() == 0) {
            wait();
        }
        String message = (String) messages.firstElement();
        messages.remove(message);
        return message;
    }
}

消費(fèi)者



/**
 * Description: 消費(fèi)者.
 *
 * @author: crane-yuan
 */
public class Consumer extends Thread
{
    Producer producer;
    Consumer(Producer p) {
        producer = p;
    }

    /**
     * Description:
     *
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
        try {
            while (true) {
                String message = producer.getMessage();
                System.out.println("Got message: "+message);
                sleep(2000);
            }
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Producer producer = new Producer();
        producer.start();
        new Consumer(producer).start();
    }
}

結(jié)果

put message...
Got message: 2016-11-5 17:06:28
put message...
Got message: 2016-11-5 17:06:30
put message...
Got message: 2016-11-5 17:06:32
put message...
put message...
Got message: 2016-11-5 17:06:33
put message...
Got message: 2016-11-5 17:06:35
put message...
Got message: 2016-11-5 17:06:36
put message...
put message...
Got message: 2016-11-5 17:06:38
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 場景:消費(fèi)者:如果當(dāng)前產(chǎn)品為0 的話,就等待; 生產(chǎn)者:生產(chǎn)一個產(chǎn)品,消費(fèi)者喚醒,消費(fèi)一個產(chǎn)品,繼續(xù)等待 實(shí)現(xiàn):
    魔器帝國閱讀 1,132評論 0 0
  • 進(jìn)程間通信有哪些方法? (1)管道(Pipe):管道可用于具有親緣關(guān)系進(jìn)程間的通信,允許一個進(jìn)程和另一個與它有共同...
    檸檬烏冬面閱讀 917評論 0 1
  • 相關(guān)概念 面向?qū)ο蟮娜齻€特征 封裝,繼承,多態(tài).這個應(yīng)該是人人皆知.有時候也會加上抽象. 多態(tài)的好處 允許不同類對...
    東經(jīng)315度閱讀 2,212評論 0 8
  • 牧翃,一個新晉的斜杠青年—— 本名:張桉源 別稱:戲霸 性別:男 就讀于:山西傳媒學(xué)院導(dǎo)演系,廣播電視編導(dǎo)專業(yè),戲...
    亥詩閱讀 701評論 1 2
  • 房間里,還飄散著香氛的余味,那是他在遇見她以后留下的,久久不散。 好久不見,她過得會好嗎?他在挪動咖啡杯的一瞬想起...
    邊思文閱讀 726評論 0 1

友情鏈接更多精彩內(nèi)容