多生产者,单一消费者的情况

时间:2011-07-28 09:58:09

标签: java multithreading producer-consumer

我有一个任务 T 以固定费率 R 运行。我有多个java程序 P1 P2 等,可以使用不同类型的输入独立完成此任务。我希望在所有程序同时运行的同时以 R 的速率完成任务 所以我正在寻找的是实现一个不同的程序 P ,它只使用来自所有程序 P1 的输入以 T 的速率完成任务, P2 等。换句话说, P1 P2 等生成数据, P 用于执行< em> T 的速率 R
我不知道的是如何建立一个可以被不同程序访问的动态队列(LinkedBlockingQueue)。

想法?

PS:如果不是Java,我也可以使用C / C ++。我更喜欢Java中的解决方案,因为程序现在是Java

2 个答案:

答案 0 :(得分:2)

好的,实现一个暴露某种界面的程序。最简单的接口是从套接字读取,甚至只是读取STDIN。你必须定义协议。例如,您可以使用标准的Java序列化。

现在你所有的程序P1,P2等都会将命令“写入”流。执行任务的程序将读取它们,存储在队列中并使用您的自定义实现java.util.Timer或Executors以指定的顺序执行。

Deamon线程在这里无关紧要。 Deamon线程是一个线程,它不会阻止程序在所有其他(非deamon)线程终止时终止。

您可以像描述为单独的java进程一样实现所有这些。我真的不明白为什么。您是否考虑过使用JMS?它将允许您完全解耦模块并使用作为一个过程和单独的过程。

答案 1 :(得分:1)

如果你真的想要一个单独的线程,而不是一个单独的进程,那么我建议如下:

  • 具有单个线程的ScheduledThreadPoolExecutor,负责执行任务。
  • 其他线程添加任务的LinkedBlockingQueue。使用阻塞队列很重要,即使你给它一个很高的容量,这样你就不会遇到生产速度比你消耗更快的情况(或者,至少要确定这种情况并采取你需要的任何步骤。
  • 一个Runnable,它将项目从队列中拉出并执行它们。您可以使用scheduleAtFixedRate()方法将此runnable添加到线程池中。