java使用Executor框架实现ProducerConsumer模式
我有两个线程,一个消费者和一个生产者。消费者线程是主线程,而生产者线程是由我使用的第三方库创建的
您使用ProducerChannel
的requestData()
向生产者线程请求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
对象
# 1 楼答案
我真的不明白你的意思。这个类不创建任何线程。所以,使用executor框架不会在这里帮助你
与使用显式同步的操作系统和使用等待和通知的线程通信不同,您可以只使用阻塞队列。当数据准备就绪时,生产者将列表添加到阻塞队列,而当阻塞队列为空时,协商者将阻塞
# 2 楼答案
我是OP。虽然封锁队列肯定会奏效,但我知道信号量将是一个更简单的解决方案
# 3 楼答案
Here is the example关于如何使用阻塞队列解决生产者-消费者问题
# 4 楼答案
我认为您应该看看BlockingQueue javadoc上的生产者-消费者示例:
http://download.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html