السلام عليكم ورحمة الله وبركاته
البرنامج هو عندي عدد من producer وعدد من consumer وعندي buffer الوسيط بين producer و consumer
كل واحد من producer ينتج منتج يضعة في buffer إذا كان فيه مكان فاضي و إلا ينتظر
وكل واحد من consumer يأخذ منتج من ال buffer إذا كان فيه منتجات و إلا ينتظر
أنا عملت البرنامج ويعمل بشكل سليم في حالة عندي producer واحد و consumer واحد
ولكن إذا زاد عدد أي من producer او consumer يعطي نتائج غير متوقعة
أرجو من أساتذتي الخبراء يفيدوني في حل هذه المشكله
package producer_consumer;
/**
*
* @author Elsayed
*/
public class CircularQueue {
private String[] queue;
private int size;
private int count;
private int front;
private int rear;
public CircularQueue(int size) {
this.size = size;
queue = new String[size];
count = 0;
front = 0;
rear = 0;
}
private boolean isEmpty(){
return (count == 0);
}
private boolean isFull(){
return (count == size);
}
synchronized public void get(String consumed) {
if(isEmpty()){
try{
wait();
}
catch(Exception e){
System.err.println("Thread Interrupted");
}
}
front %= size;
count--;
System.out.println(consumed + queue[front++] + " <<-- ( " +
count + " )" );
notify();
}
synchronized public void put(String item) {
if(isFull()){
try{
wait();
}
catch(Exception e){
System.err.println("Thread Interrupted");
}
}
count++;
System.out.println(item + "-->> ( " + count + " )" );
rear %= size;
queue[rear++] = item;
notify();
}
}
package producer_consumer;
/**
*
* @author Elsayed
*/
public class Producer extends Thread{
private CircularQueue queue;
private String producerName;
private int item = 0;
public Producer(CircularQueue queue, String pName) {
this.queue = queue;
producerName = pName;
}
public void run() {
while(true)
queue.put(producerName + " : " + "Item ( " + (++item) + " )" );
}
}package producer_consumer;
/**
*
* @author Elsayed
*/
public class Consumer extends Thread{
private CircularQueue queue;
private String consumerName;
public Consumer(CircularQueue queue, String cName) {
this.queue = queue;
consumerName = cName;
}
public void run() {
while(true)
queue.get(consumerName + " consumes ");
}
}package producer_consumer;
/**
*
* @author Elsayed
*/
public class Main {
static final int NUM_OF_PRODUCERS = 1;
static final int NUM_OF_CONSUMERS = 1;
static final int BUFFER_SIZE = 3;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Producer[] producer = new Producer[NUM_OF_PRODUCERS];
Consumer[] consumer = new Consumer[NUM_OF_CONSUMERS];
CircularQueue buffer = new CircularQueue(BUFFER_SIZE);
for(int i = 0; i < producer.length; i++){
producer = new Producer(buffer, "Producer # [" + ( i+1 ) + "]");
producer.start();
}
for(int i = 0; i < consumer.length; i++){
consumer = new Consumer(buffer, "consumer # [" + ( i+1 ) + "]");
consumer.start();
}
}
}