У меня есть задача T, которую нужно выполнять с фиксированной скоростью R. У меня есть несколько java-программ P1, P2 и т. д., выполняющих эту задачу независимо друг от друга с входными данными разных типов. Я хочу, чтобы задача выполнялась со скоростью R, пока все программы работают одновременно.
Поэтому я ищу реализацию другой программы P, которая выполняет задачу только со скоростью T с входными данными из всех программ P1, P2 и т. д. Другими словами, P1, P2 и т. д. генерируют данные, которые P потребляет для выполнения T со скоростью R
Что я не знаю, как создать динамическую очередь (может быть LinkedBlockingQueue), к которой могут обращаться разные программы.
Идеи?
PS: Если не Java, я также могу использовать C/C++. Я бы предпочел решения на Java, так как программы теперь на Java
Несколько производителей, один потребитель
Ответы (2)
Хорошо, реализуйте программу, которая предоставляет какой-то интерфейс. Самый простой интерфейс — это чтение из сокета или даже просто STDIN. Вы должны определить протокол. Например, вы можете использовать стандартную сериализацию Java.
Теперь все ваши программы P1, P2 и т.д. будут "записывать" команды в поток. Программа, которая выполняет задачи, будет читать их, сохранять в очереди и выполнять в указанном порядке, используя либо вашу пользовательскую реализацию, либо java.util.Timer, либо Executors.
Тема Демона здесь неуместна. Поток демона — это поток, который не предотвращает завершение программы, когда все другие (не демонические) потоки были завершены.
Вы можете реализовать все это, как вы описали, как отдельные процессы Java. Я просто действительно не понимаю, почему. Вы, наверное, думали об использовании JMS? Это позволит вам полностью разделить ваши модули и использовать как один процесс, так и отдельные процессы.
Если вам действительно нужен отдельный поток, а не отдельный процесс, я бы рекомендовал следующее:
- ScheduledThreadPoolExecutor с одним потоком, который отвечает за выполнение задач.
- LinkedBlockingQueue, которую добавляют другие потоки задачи к. Важно использовать блокирующую очередь, даже если вы даете ей большую емкость, чтобы не попасть в ситуацию, когда вы производите быстрее, чем потребляете (или, по крайней мере, чтобы определить эту ситуацию и принять меры). любые шаги, которые вам нужны).
- Runnable, который извлекает элементы из очереди и выполняет их. Вы бы добавили этот runnable в пул потоков с помощью метода
scheduleAtFixedRate()
.