麻烦的线程安全队列类。具体而言,有例外

时间:2012-05-09 04:24:13

标签: java multithreading exception

我正在使用线程安全的队列类,并且我已经定义了insert方法的问题。 Buffer存储一个数组(elementData),该数组使用start / end变量来知道从队列中添加/删除内容的位置。它是线程安全的,所以它使用同步方法,所以我可以让多个线程引用相同的缓冲区。

public class Buffer<T> {
    private T[] elementData;                     
    private int elementCount;
    private int start;                                      
    private int end;

    // Additional fields

    // Code to instantiate a Buffer, other methods (e.g. delete)

    public synchronized void insert(T t) throws InterruptedException {
        while (elementCount == elementData.length) {
            wait();
        }
        end = (end + 1) % elementData.length;
        elementData[end] = t;
        elementCount++;
        notifyAll();
    }

    public static void main(String[] args) {
        Buffer<Integer> b = new Buffer();
        b.insert(3);
    }
}

以下是我对情况的理解。当调用诸如insert之类的方法时,我们希望能够抛出在调用main方法或其他某个线程时可能发生的异常,并尝试在挂起时执行insert。但我不明白的是为什么我得到这个未报告的例外。我认为在方法之后有一个“抛出InterruptedException”就足够了。我需要一个“尝试”块吗?我尝试使用try块的尝试都失败了,所以我对如何解决这个错误感到有点难过。

另外,我知道我没有运行任何实际的线程。一旦我能解决这个未报告的异常,我会做那些。 :)感谢任何可以提供帮助的人。

Buffer.java:56: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
b.insert(3);

1 个答案:

答案 0 :(得分:2)

编译异常是因为你的insert方法可能抛出InterruptedException(即使你没有故意抛出它),所以调用它的每个方法都必须使用try / catch块,即使错误永远不会出现:

public static void main(String[] args) {
    Buffer<Integer> b = new Buffer();
    try {
        b.insert(3);
    } catch(InterruptedException ie) {
        //error handling
        e.printStackTrace();
    }
}