Java 队列已满错误,使用多个使用者、生产者

Java 队列已满错误,使用多个使用者、生产者,java,multithreading,Java,Multithreading,我想模拟以下场景:多个使用者、生产者线程正在修改一些数据 安装程序 过滤器1 所以,概括一下:Producer将某些内容放入一个队列中,filter1从中读取。它修改数据并将其发布到另一个队列,过滤器2从中读取数据。过滤器2打印最终数据 此代码在以下情况下失败: Exception in thread "Thread-2" java.lang.IllegalStateException: Queue full 你能帮我理解为什么吗?你应该使用put()而不是add()同步队列总是空的满的,它没

我想模拟以下场景:多个使用者、生产者线程正在修改一些数据

安装程序 过滤器1 所以,概括一下:Producer将某些内容放入一个队列中,filter1从中读取。它修改数据并将其发布到另一个队列,过滤器2从中读取数据。过滤器2打印最终数据

此代码在以下情况下失败:

Exception in thread "Thread-2" java.lang.IllegalStateException: Queue full

你能帮我理解为什么吗?

你应该使用
put()
而不是
add()
同步队列总是空的满的,它没有深度。put()将告诉队列挂起该线程,直到另一个线程进入并将该元素从队列中移除


add()
方法只有在有线程在等待时才会成功,如果没有线程在等待,您将获得队列已满异常

太棒了!非常感谢你,约翰萨德!!我只能投一次票。。但是,我希望给予更多。。我的代码在带有add()的windows上运行良好,但队列已满。。在linux中。。我做了一件愚蠢的事:(-谢谢约翰。@John为什么用windows而不用linux?你知道吗?
public void run() {
    try {
        while (true) {
            this.q.put(saySomething());
        }
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
}

public String saySomething() {
    return "Something";
}
public void run() {
    try {
        while (true) {
            consume(qIn.take());
        }
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
}

private void consume(String take) {
    //Modify data according to some rules
    String newData = take.replace("m", "-");
    produce(newData);
}

private void produce(String newData) {
    // put new data in queue out
    qOut.add(newData);                   // <-- Stacktrace points here
}
public void run() {
    try {
        while (true) {
            consume(qIn.take());
        }
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
}

private void consume(String s) {
    System.out.println("Something became: " + s);
}
Exception in thread "Thread-2" java.lang.IllegalStateException: Queue full