java - 如何用java开发类似生产者消费者的应用?

标签 java multithreading concurrency producer-consumer

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

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

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

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

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

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

最佳答案

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

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

对于第二个问题,您想了解(google 一下!)Java 中的同步。您可以再次将相同的 private Object lock1 = new Object(); 传递给消费者和生产者,他们可以将其用作共享锁。

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

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

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

关于java - 如何用java开发类似生产者消费者的应用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7550716/

相关文章:

java - 在eclipse中创建jsp文件时遇到问题

java - Vertx 缩放每个线程的实例数

c# - 允许线程有序进入的WaitHandle.WaitAny

java - 在某些情况下,计数器为负值。为什么?以及如何解决这个问题?

c# - 双重双锁检查的可能不正确的实现

java - Lenovo Tab 7 在商店中看不到 apk

java - BST(二叉搜索树)中的字符串 toString 方法

java - 如何编写 JpaRepository 方法来搜索在 Set<String> 中存储电话号码的用户

java - 在哪些情况下 volatile 比锁定更好?

具有连续无界输入的Python ThreadPoolExecutor