我正在消费者和制作人中使用BoundedBuffer类,我们想在该类中使用Semaphore 我们这样做但是每次使用 acquire()都会出错 rerror是:
未报告的异常java.lang.InterruptedException;必须被抓住或宣布被抛出
以下是代码:
import java.util.concurrent.Semaphore;
public class BoundedBuffer implements Buffer {
private static final int BUFFER_SIZE = 4;
/**
* volatile does not appear in the printed text. A discussion of
* volatile is in chapter 7.
*/
private volatile int count;
private Object[] buffer;
private int in; // points to the next free position in the buffer
private int out; // points to the next full position in the buffer
private Semaphore mutex;
private Semaphore empty;
private Semaphore full;
public BoundedBuffer() { //constractur
// buffer is initially empty
//count = 0;
in = 0;
out = 0;
buffer = new Object[BUFFER_SIZE];
mutex = new Semaphore(1);
empty = new Semaphore(BUFFER_SIZE);
full = new Semaphore(0);
}
// producer calls this method
public void insert(Object item) {
//while (count == BUFFER_SIZE)
// ; // do nothing the brach full
// add an item to the buffer
// ++count;
empty.acquire();
mutex.acquire();
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;//that to do cyrcle or to go to the begining againe
/*
if (count == BUFFER_SIZE)
System.out.println("Baker put " + item + " Shelf FULL");
else
System.out.println("Baker put " + item + " Shelf Size = " + count);
*/
mutex.release();
full.release();
}
// consumer calls this method
public Object remove() {
//Object item;
full.acquire();
mutex.acquire();
//while (count == 0)
; // do nothing the buffer is empty
// remove an item from the buffer
//--count;
Object item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
mutex.release();
empty.release();
return item;
}
}
答案 0 :(得分:2)
也许我完全不懂你的应用程序,但是你不能只使用java.util.concurrent包(ArrayBlockingQueue)中已经提供的有界缓冲区类吗?
这是一个经典的“有界缓冲区” 固定大小的数组 生产者插入的元素和 消费者提取。一旦创建, 容量不能增加。 尝试将元素置于完整状态 queue将导致put操作 阻塞;尝试检索 来自空队列的元素将 同样阻止。
答案 1 :(得分:1)
错误告诉你所有你需要知道的事情; InterruptedException可能会被获取 - 这需要a)捕获它并处理它或b)允许它传播出调用函数 - 需要你将它添加到函数抛出sepcification。
答案 2 :(得分:1)
您需要处理acquire方法抛出的异常。