2

下面是我实现的PC问题生产者消费者界缓冲区使用旗语

public class CircularQueue { 
Queue <Integer>queue = new LinkedList<Integer>(); 
final int LIMIT = 10; 
static Semaphore semProd = new Semaphore(1); 
static Semaphore semConsu = new Semaphore(0); 
public void enqueue(int productId) throws InterruptedException{ 

     semProd.acquire(); 
     queue.add(productId); 
     System.out.println(Thread.currentThread().getName()+" Putting(In Q) Product ID:"+productId); 
     semConsu.release(); 
} 

public int deueue() throws InterruptedException{ 
     semConsu.acquire(); 
     int productID = (int) queue.remove(); 
     System.out.println(Thread.currentThread().getName()+" Getting (In Q) Product ID:"+productID); 
     semProd.release(); 
    return productID; 
} 
} 



//producer class 
public class Producer implements Runnable{ 
CircularQueue cQueue ; 
public Producer(CircularQueue queue){ 
    this.cQueue = queue; 

} 

public void run(){ 
    while(true){ 
    for(int i =0 ; i < 5 ;i++){ 

     try { 
      cQueue.enqueue(i); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    }}} 


//consumer class 
public class Consumer implements Runnable{ 

CircularQueue cQueue ; 
public Consumer(CircularQueue cQueue){ 
    this.cQueue = cQueue; 

} 
public void run(){ 

    try { 
     while(true){ 
     int item = cQueue.deueue(); 
     Thread.sleep(2000);} 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


}} 


//Driver Class 
public class DriverClass { 

public static void main(String args[]){ 

    CircularQueue cQueue = new CircularQueue(); 
    new Thread(new Producer(cQueue)).start(); 
    new Thread(new Consumer(cQueue)).start(); 


}} 

1)如何检查我的实现是正确 2)如果我想编辑多个消费者和多个生产商的解决方案那么我应该如何改变执行方式

正在增加semProduce的数量和sem消耗不够?

static Semaphore semProd = new Semaphore(4);//4 producer 
static Semaphore semConsu = new Semaphore(3);//3 consumer 
+0

为什么不使用来自'java.util.concurrent'的类,比如''SynchronousQueue'用于单个生产者情况,''BlockingQueue'在多生产者情况下容量有限? – 2015-04-03 06:25:45

+0

嗨安迪我知道类是实际实施中更好的选择,但我正在准备面试,所以我想知道如何用信号量做到这一点。 – user2895589 2015-04-03 15:54:18

回答

2

对于具有信号量的通用有界多生产者/消费者阻塞队列,需要其中的三个。一个用于统计队列中空闲空间的数量(初始化为队列的LIMIT),一个用于统计队列中的项目数(初始化为零),另一个用于保护队列免受多个访问的影响((初始化为1,充当互斥体)。

伪代码:

制片:等待(免费);等待(互斥); queue.push(的newitem);发送(互斥);发送(项目);

消费者:等待(物品);等待(互斥);结果=(queue.pop);发送(互斥);发送(免费);返回结果;

相关问题