我必须开发一个类似于java中的生产者 - 消费者问题的应用程序。
但是我不太了解java,我有几个问题。
生产者和消费者都是不同的线程,他们都需要访问相同的缓冲区。如果它们都是不同的类(扩展线程类或实现可运行的接口),我如何编码它们以使用完全相同的缓冲区(这个假定的缓冲区是某个对象的数组)?
我还想阅读有关整体架构如何以及如何实现它们的一些建议。我需要对它们进行编码,以便两个线程不会同时使用相同的缓冲区位置,两个生成器线程不会同时插入完全相同的值,生产者无法在一个新项目中插入新项目已经填充缓冲区,当缓冲区为空时,消费者不应该使用它。
在这个例子中,必须有几个消费者和几个生产者同时工作。
我在java中查找了一些示例,但它们与我需要的完全不同。
答案 0 :(得分:4)
您可以通过传递构造函数将数组或列表的同一实例传递给使用者和生产者。
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)
}
}
}
答案 1 :(得分:3)
确实在java核心库(1.5或更高版本)中,已经存在满足您需求的数据结构。在java.util.concurrent包中,BlockedQueue,LinkedBlockedQueue..etc都是用于并发使用的。