当我们在消费者和生产者缓冲区中使用信号量时

时间:2009-05-11 09:37:55

标签: java multithreading concurrency semaphore

我正在消费者和制作人中使用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;
    }
}

3 个答案:

答案 0 :(得分:2)

也许我完全不懂你的应用程序,但是你不能只使用java.util.concurrent包(ArrayBlockingQueue)中已经提供的有界缓冲区类吗?

  

这是一个经典的“有界缓冲区”   固定大小的数组   生产者插入的元素和   消费者提取。一旦创建,   容量不能增加。   尝试将元素置于完整状态   queue将导致put操作   阻塞;尝试检索   来自空队列的元素将   同样阻止。

答案 1 :(得分:1)

错误告诉你所有你需要知道的事情; InterruptedException可能会被获取 - 这需要a)捕获它并处理它或b)允许它传播出调用函数 - 需要你将它添加到函数抛出sepcification。

答案 2 :(得分:1)

相关问题