有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Executor框架实现ProducerConsumer模式

我有两个线程,一个消费者和一个生产者。消费者线程是主线程,而生产者线程是由我使用的第三方库创建的

您使用ProducerChannelrequestData()向生产者线程请求List数据,后者立即返回。然后,生产者线程将异步地逐个生成数据,并使用回调方法发送每个数据。我希望请求数据的方法同步返回结果。最直接的方法是使用wait()notify()如下所示

public class DataFeed {
    boolean done;
    private List<Data> dataList;
    private ProducerChannel producerChannel;

    // This method should be synchronous.
    public List<Data> getDataList() {
        this.producerChannel.requestData();

        while (!done) {
            wait();
        }

        List<Data> dataList = this.dataList;
        this.dataList = null;

        return dataList;
    }

    // This is the call back method invoked by the producer thread.  
    public void generated(Data data) {
        if (data == null) {
            done = true; // End of data.
            notify();
        }
        else {
            this.dataList.add(data);
        }
    }
}

请注意,整个应用程序中只有一个使用者线程。这就是为什么DataFeed只有一个List来保存每个请求的结果。我了解到Executor框架现在是管理线程的首选方式。如何重构这个类,使其在不创建额外线程的情况下不显式使用Thread对象


共 (4) 个答案

  1. # 1 楼答案

    我真的不明白你的意思。这个类不创建任何线程。所以,使用executor框架不会在这里帮助你

    与使用显式同步的操作系统和使用等待和通知的线程通信不同,您可以只使用阻塞队列。当数据准备就绪时,生产者将列表添加到阻塞队列,而当阻塞队列为空时,协商者将阻塞

  2. # 2 楼答案

    我是OP。虽然封锁队列肯定会奏效,但我知道信号量将是一个更简单的解决方案

  3. # 3 楼答案

    Here is the example关于如何使用阻塞队列解决生产者-消费者问题