2013-12-13 35 views
0

我有一组问题把生产者/消费者问题..是否可以在同一时间使用线程使用者/生产者?

  1. 是有可能使在同一时间一个线程消费者和生产者?

  2. 在线程之间发送/接收数据的最佳块队列类型是什么?

  3. 是否可以限制线程之间的传输以设置线程实例?如何 ?

谢谢。

对于问题否1.我认为BlockingDeque是解决方案。 这是一些解释:http://tutorials.jenkov.com/java-util-concurrent/blockingdeque.html

+0

这种并发模式有时被称为“工作列表”。例如,通过递归探索目录搜索文件中的特定字符串可以实现为保持并发结构(工作列表)以容纳目录这仍然需要探索。每个工作者线程从列表中取出一个项目,用它做一些事情,并且可能将childeren目录放回到工作列表中,以便由其自己或另一个工作线程处理。 – Xantix

回答

4
  1. 是的。通常,如果一个线程既是消费者又是生产者,它会消耗与生产不同的“产品”,但它也可以消费自己的产品。

  2. 取决于消息的特征和传输速率。但通常收益可以忽略不计。

  3. 是的 - 只是将队列传递给相关方。

+0

对于问题3:如果一个实例需要两个队列路径..一个来自队列1,另一个来自队列2,就像路由器..在子网之间.. – user1261494

+0

我认为“Exchanger”将在我的情况下用于创建一个路由器。这里是一个例子:http://tutorials.jenkov.com/java-util-concurrent/exchanger.html – user1261494

2

为了增加阿列克谢的回答是:

  1. 虽然这是可能的,请注意,这样的线程将不得不拆分它的消费国和生产活动之间的CPU时间,因此他们不能同时运行。但是它是完全可行的,例如,如果你的线程接受了一些数据(从它的消费者端队列中取得它),以某种方式快速转换并将其卸载到下一个队列中;

  2. 尽管LinkedBlockingQueue最大限度地减少了生产者方的阻塞,但如果消费者的工作速度比生产者慢得多(例如,消费者对生产者的输入进行一些长时间运算),它的使用可能导致内存耗尽。所以,你可能想要ArrayBlockingQueue,这是有界的,因此,不会导致OutOfMemory错误。