当我们在消费者和生产者缓冲区中使用信号量时
我正在消费者和生产者中研究 BoundedBuffer 类,我们想在该类中使用信号量 我们这样做了,但是每次使用 acquire() 时都会出现错误 错误是:
未报告的异常 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;
}
}
I am working on BoundedBuffer class in consumer and producer we want to use the Semaphore in that class
we did that but there are an error in every use of acquire()
the rerror is:
unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
Here is the code:
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;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
也许我不完全理解你的应用程序,但你不能只使用 java.util.concurrent 包中已经提供的有界缓冲区类(ArrayBlockingQueue)?
Maybe I do not understand your application completely, but could not you just use the bounded buffer class that is already provided in the java.util.concurrent package (ArrayBlockingQueue)?
该错误告诉您所有您需要知道的信息; InterruptedException 可能会被 acquire 引发 - 因此您需要 a) 捕获它并处理它,或者 b) 允许它从调用函数中传播 - 需要您将其添加到函数中,从而抛出异常。
The error tells you all you need to know; InterruptedException may be thropwn by acquire - hence you need to either a) catch it and handle it or b) allow it to propagate out of the calling function - necessitating you adding it to the functions throws sepcification.
您需要处理
You need to handle exceptions thrown by the acquire method.