Несколько производителей, один потребитель

У меня есть задача T, которую нужно выполнять с фиксированной скоростью R. У меня есть несколько java-программ P1, P2 и т. д., выполняющих эту задачу независимо друг от друга с входными данными разных типов. Я хочу, чтобы задача выполнялась со скоростью R, пока все программы работают одновременно.
Поэтому я ищу реализацию другой программы P, которая выполняет задачу только со скоростью T с входными данными из всех программ P1, P2 и т. д. Другими словами, P1, P2 и т. д. генерируют данные, которые P потребляет для выполнения T со скоростью R
Что я не знаю, как создать динамическую очередь (может быть LinkedBlockingQueue), к которой могут обращаться разные программы.

Идеи?

PS: Если не Java, я также могу использовать C/C++. Я бы предпочел решения на Java, так как программы теперь на Java


person shyam    schedule 28.07.2011    source источник
comment
Эти потоки выполняют задачу или процессы? Если потоки, зачем вам другой процесс?   -  person parsifal    schedule 28.07.2011


Ответы (2)


Хорошо, реализуйте программу, которая предоставляет какой-то интерфейс. Самый простой интерфейс — это чтение из сокета или даже просто STDIN. Вы должны определить протокол. Например, вы можете использовать стандартную сериализацию Java.

Теперь все ваши программы P1, P2 и т.д. будут "записывать" команды в поток. Программа, которая выполняет задачи, будет читать их, сохранять в очереди и выполнять в указанном порядке, используя либо вашу пользовательскую реализацию, либо java.util.Timer, либо Executors.

Тема Демона здесь неуместна. Поток демона — это поток, который не предотвращает завершение программы, когда все другие (не демонические) потоки были завершены.

Вы можете реализовать все это, как вы описали, как отдельные процессы Java. Я просто действительно не понимаю, почему. Вы, наверное, думали об использовании JMS? Это позволит вам полностью разделить ваши модули и использовать как один процесс, так и отдельные процессы.

person AlexR    schedule 28.07.2011

Если вам действительно нужен отдельный поток, а не отдельный процесс, я бы рекомендовал следующее:

  • ScheduledThreadPoolExecutor с одним потоком, который отвечает за выполнение задач.
  • LinkedBlockingQueue, которую добавляют другие потоки задачи к. Важно использовать блокирующую очередь, даже если вы даете ей большую емкость, чтобы не попасть в ситуацию, когда вы производите быстрее, чем потребляете (или, по крайней мере, чтобы определить эту ситуацию и принять меры). любые шаги, которые вам нужны).
  • Runnable, который извлекает элементы из очереди и выполняет их. Вы бы добавили этот runnable в пул потоков с помощью метода scheduleAtFixedRate().
person parsifal    schedule 28.07.2011
comment
На самом деле мне нужен отдельный процесс. P1, P2 и т. д. - это разные Java-программы, и все они должны выполнять задачу T (наряду с другими их вещами). И мне нужно, чтобы задача T выполнялась с фиксированной скоростью, для чего я подумал, что буду использовать отдельный процесс, который просто выполняет T. Итак, в вашем решении есть ли способ сделать все процессы P1, P2 и т. д. помещенными в очередь, а другой процесс взять из нее? - person shyam; 28.07.2011