繁体   English   中英

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

[英]How to develop an application similar to producer consumer in java?

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

但是我不太了解java,我有几个问题。

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

我还想了解一些有关整体架构以及如何实现它们的建议。 我需要对它们进行编码,以便两个线程不会同时使用相同的缓冲区位置,两个生成器线程不会同时插入完全相同的值,生产者无法在一个新项目中插入新项目已经填充缓冲区,缓冲区为空时没有消费者应该消耗。

在这个例子中,必须有几个消费者和几个生产者同时工作。

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

您可以通过传递它们的构造函数将同一个数组或列表实例传递给使用者和生产者。

Array a = new Array();
Consumer c = new Consumer(a);
Producer p = new Producer(a);

对于第二个问题,您希望了解(google it!)以便在Java中进行同步。 您可以再次传入相同的private Object lock1 = new Object(); 消费者和生产者都可以使用它作为共享锁。

http://download.oracle.com/javase/tutorial/essential/concurrency/locksync.html

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

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..etc都是用于并发使用的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM