如何在java中开发类似于生产者-消费者的应用程序?

如何在java中开发类似于生产者-消费者的应用程序?,java,multithreading,concurrency,producer-consumer,Java,Multithreading,Concurrency,Producer Consumer,我必须开发一个类似于java中生产者-消费者问题的应用程序 然而,我对java知之甚少,我有几个问题 生产者和消费者都是不同的线程,他们都需要访问相同的缓冲区。如果它们都是不同的类(扩展thread类或实现runnable接口),如何对它们进行编码以使用完全相同的缓冲区(这个假定的缓冲区是某个对象的数组) 我还想阅读一些关于整体架构如何实现以及如何实现它们的建议。我需要对它们进行编码,以便两个线程不会同时使用相同的缓冲区位置,两个生产者线程不会同时插入完全相同的值,生产者不能在已填充的缓冲区中插

我必须开发一个类似于java中生产者-消费者问题的应用程序

然而,我对java知之甚少,我有几个问题

生产者和消费者都是不同的线程,他们都需要访问相同的缓冲区。如果它们都是不同的类(扩展thread类或实现runnable接口),如何对它们进行编码以使用完全相同的缓冲区(这个假定的缓冲区是某个对象的数组)

我还想阅读一些关于整体架构如何实现以及如何实现它们的建议。我需要对它们进行编码,以便两个线程不会同时使用相同的缓冲区位置,两个生产者线程不会同时插入完全相同的值,生产者不能在已填充的缓冲区中插入新项,并且当缓冲区为空时,消费者不应使用

在此示例中,必须有多个消费者和多个生产者同时工作


我在java中查找了一些示例,但它们都与我需要的不同。

您可以通过其构造函数将相同的数组或列表实例传递给使用者和生产者

Array a = new Array();
Consumer c = new Consumer(a);
Producer p = new Producer(a);
对于第二个问题,您想了解Java中同步的(google it!)。您可以再次传入相同的
private Object lock1=new Object()
同时提供给消费者和生产者,他们可以将其用作共享锁

每当使用者或生产者访问共享阵列时,他们都需要首先获取锁。其他条件要求,如“阵列已满时不插入元素”或“阵列为空时不使用元素”,可以在同步块内实现

public void add(Object someObject){
    synchronized (lock1) {
        if(a.size()>limit) {
            System.out.println("Array is full");
        } else {
           a.add(someObject)
        }
    }
}

事实上,在java核心库(1.5版或更高版本)中,已经有了满足您需要的数据结构。在java.util.concurrent包下,BlockedQueue、LinkedBlockedQueue..等都是用于并发使用的。

即BlockingQueue和LinkedBlockingQueue。