Java實現生產者消費者問題

2021-09-01 21:46:49 字數 2057 閱讀 9146

生產者-消費者(producer-consumer)問題,也稱作有界緩衝區(bounded-buffer)問題,兩個程序共享乙個公共的固定大小的緩衝區。其中乙個是生產者,用於將訊息放入緩衝區;另外乙個是消費者,用於從緩衝區中取出訊息。問題出現在當緩衝區已經滿了,而此時生產者還想向其中放入乙個新的資料項的情形,其解決方法是讓生產者此時進行休眠,等待消費者從緩衝區中取走了乙個或者多個資料後再去喚醒它。同樣地,當緩衝區已經空了,而消費者還想去取訊息,此時也可以讓消費者進行休眠,等待生產者放入乙個或者多個資料時再喚醒它。

一,首先定義公共資源類,其中的變數number是儲存的公共資料。並且定義兩個方法,增加number的值和減少number的值。由於多執行緒的原因,必須加上synchronized關鍵字,注意while判斷的條件。

package

com.wjy.resources;

public

class

publicresource

catch

(interruptedexception e)

} number++;

system.out.println("producer "+threadname+" product one: "+number);

notify();

} /*** 減少公共資源

*/public

synchronized

void

decreace(string threadname)

catch

(interruptedexception e)

} number--;

system.out.println("consumer "+threadname+" consume one: "+number);

notify();

} }

二,分別定義生產者執行緒和消費者執行緒,並模擬多次生產和消費,即增加和減少公共資源的number值

package

com.wjy.producer;

import

com.wjy.resources.publicresource;

public

class producerthread implements

runnable

@override

public

void

run()

catch

(interruptedexception e)

resource.increace(threadname);

} }

}

package

com.wjy.consumer;

import

com.wjy.resources.publicresource;

public

class consumerthread implements

runnable

@override

public

void

run()

catch

(interruptedexception e)

resource.decreace(threadname);

} }

}

三,模擬多個生產者和消費者操作公共資源的情形,結果須保證是在允許的範圍內。

package

client;

import

com.wjy.consumer.consumerthread;

import

com.wjy.producer.producerthread;

import

com.wjy.resources.publicresource;

/*** this is an example that has three producers,two consumers. */

public

class

client

}

生產者消費者問題(java實現)

1 生產者 消費者模型 若容器容量為1 生產者執行緒 if a 1 a notify 消費者 if a 0 a notify 2 下面是乙個 實現 簡單的快取容量只有1,即 若容器中有乙個了,就不能再生產了 1 最基本的寫法 資源類 public class sample catch interru...

Java消費者生產者問題

乙個執行緒作為生產者,乙個執行緒作為消費者。生產者和消費者在同時執行。生產者每生產一次消費者就消費一次。生產和消費的數量用隨機數來表示。要求 生產者的數量和上次消費後的剩餘數量和不大於1000.sleep 可以指定休眠的時間,如果沒有其他操作,那麼到點自然醒。如果sleep有鎖資源,那麼不釋放 執行...

java生產者消費者

題目 請用多執行緒實現乙個生產者類和乙個消費者類,生產者隨機生成20個字元,消費者將字元列印到控制台。class syncstackcatch interruptedexception e this.notify 通知其它執行緒把資料出棧 buffer index c 資料入棧 index 指標向上...