java - 线程安全队列类出现问题。具体来说,除了异常(exception)情况

标签 java multithreading exception

我正在使用线程安全队列类,并且我定义的插入方法有问题。 Buffer 存储一个数组(elementData),该数组使用开始/结束变量来知道在队列中添加/删除内容的位置。它是线程安全的,因此它使用同步方法,因此我可以让多个线程引用同一个缓冲区。

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 之类的方法时,我们希望能够抛出异常,该异常可能在主方法或其他线程被调用并尝试在挂起时执行插入时发生。但我不明白的是为什么我会得到这个未报告的异常。我认为在该方法之后有一个“抛出InterruptedException”就足够了。我需要一个“尝试” block 吗?我对 try block 的尝试都失败了,所以我对如何修复此错误感到有点困惑。

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

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

最佳答案

编译异常是因为您的 insert 方法可能会抛出 InterruptedException(即使您不是故意抛出它),因此调用它的每个方法都必须使用 try/catch block ,即使如果错误从未出现:

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

关于java - 线程安全队列类出现问题。具体来说,除了异常(exception)情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10509822/

相关文章:

java - Policy.setPolicy() 似乎无法正常工作

c++ - fgets 与 std::fgets - fgets 错过了行

python - 如何防止 Python 返回到 C++ boost::python::error_already_set?

exception - 如何在 Octave 的.oct文件中引发异常?

java - 无效问题 : boolean replaced return of integer sized value with (x == 0 ? 1 : 0) → SURVIVED

java - 并发异常

c++ - 使用 Boost C++ 的多线程 - 同步问题

c - 随机矩形上的 Windows API 程序...我不知道变量如何获取其值

c# - 检测异常是否为损坏状态异常

java - Guava Joiner 对 null 元素抛出 NPE