gpt4 book ai didi

java - 使用信号量的生产者消费者有界缓冲区

转载 作者:行者123 更新时间:2023-11-30 08:54:23 24 4
gpt4 key购买 nike

下面是我对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 consume 是否足够?

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

最佳答案

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

伪代码:

生产者:WAITING(免费);等待(互斥锁); queue.push(newItem);发送(互斥锁);发送(项目);

消费者:WAITING(元素);等待(互斥量);结果=(queue.pop);发送(互斥锁);发送(免费);返回结果;

关于java - 使用信号量的生产者消费者有界缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29426908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com