0

私はコンシューマーとプロデューサーで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;
    }
}
4

3 に答える 3

2

あなたのアプリケーションを完全には理解していないかもしれませんが、java.util.concurrent パッケージ ( ArrayBlockingQueue ) で既に提供されている境界付きバッファー クラスを使用することはできませんか?

これは従来の「境界付きバッファ」であり、固定サイズの配列がプロデューサーによって挿入され、コンシューマーによって抽出された要素を保持します。一度作成すると、容量を増やすことはできません。満杯のキューに要素を配置しようとすると、配置操作がブロックされます。空のキューから要素を取得しようとすると、同様にブロックされます。

于 2009-05-11T09:53:10.620 に答える
1

エラーは、知っておく必要があるすべてを示しています。InterruptedException は取得によってスローされる可能性があります-したがって、a) キャッチして処理するか、b) 呼び出し元の関数から伝播できるようにする必要があります-関数に追加する必要があるため、指定がスローされます。

于 2009-05-11T09:56:47.400 に答える
1

取得メソッドによってスローされた例外を処理する必要があります。

于 2009-05-11T10:11:34.273 に答える