Я хотел бы смоделировать распределенную систему и то, как машины выполняют свою работу, принятая топология является централизованной, у меня много маленьких систем, в которых каждая подсистема принимает эту топологию, я имею в виду, я предполагаю, что моя распределенная система состоит из множества централизованных систем. . Я создал простой симулятор дискретных событий, который имитирует работу в централизованной системе Side One, код такой:
public class SimuleOnesystem {
// a set of parameters
class Arrival{// here we simulate the arrival of works to a server
// the code..
}
class Service{// here we simulate the services }
class Departure{// means that the work is well done
}
}
Мой вопрос в том, как я мог бы использовать этот код в многопоточном режиме, я имею в виду, что хотел бы запустить, например, 5 централизованных систем одновременно, в которых каждая система имеет свои собственные часы моделирования, список событий и т. Д., И эти системы могут обмениваться данными между собой. в части отправки и получения запросов и выполнения заданий и т. д.
Заранее спасибо.
3 ответа
Помимо введения потоков, как уже указывалось в других ответах, ваш комментарий к ответ предъявителя звонка верен: вы должны позаботиться о списке событий и имитационных часах .
Насколько я понимаю, ваш пример является довольно типичным дискретным моделированием событий . Попытка распараллелить их даже между потоками, то есть в одном адресном пространстве (выполняется одной и той же JVM на одной машине, которая может иметь несколько ядер и т. Д.), Не совсем тривиальна. Я предлагаю вам начать с чтения вводного материала по этому вопросу (я бы порекомендовал эта книга).
Ваша основная проблема заключается в том, что вы не можете предотвратить выполнение некоторых потоков быстрее, чем другие (например, потому что они должны обрабатывать меньшую нагрузку), и, следовательно, их локальные часы могут перейти в смоделированное «будущее». Если один из других потоков, то есть поток, который отстает, теперь выдает новое событие / сообщение, которое должно быть обработано одним потоком, который продвинулся слишком далеко во времени, все сломается (или тихо завершится с ошибкой и станет недействительным) . Подумайте об открытии своего почтового ящика сегодня и получении сообщения из прошлого года, на которое вы также должны были немедленно ответить ...
Алгоритмы, предотвращающие возникновение подобных ситуаций, называются алгоритмами синхронизации . По сути, существует два вида этих методов: оптимистичные методы позволяют таким сбивчивым событиям (сообщениям из прошлого) происходить, но обнаруживают их и при необходимости устраняют любые несоответствия. Однако в вашем случае кажется целесообразным сначала взглянуть на консервативные алгоритмы, которые полностью избегают таких методов. Их (обычно) проще реализовать, но они работают хорошо только в том случае, если есть определенные задержки между отправителем события и временем, когда событие должно быть выполнено (например, см. этот классический документ , чтобы узнать подробности, или этот более свежий, подробно описывающий систему моделирования на основе Java, которая использует консервативную синхронизацию). Если у вас есть алгоритм синхронизации, он также будет управлять вашими локальными часами моделирования.
Поскольку реализация этих алгоритмов занимает довольно много времени, вы также можете рассмотреть возможность использования некоторой среды моделирования на основе Java или библиотеки, которая уже предоставляет методы (это хорошо известная проблема).
На самом базовом уровне все, что вам нужно сделать, это создать SimuleOnesystem
Thread
или Runnable
- затем из программы драйвера, такой как метод main
, создать как сколько угодно тем и start
их.
Я не имею в виду это как легкомысленный ответ, но: , купи сейчас ...
Но если серьезно, то сейчас вы быстро попадаете в очень сложный сценарий тестирования. Я не верю, что вам придется использовать java.util.concurrent.ExecutorService
, но если вы собираетесь обмениваться данными между потоками, вы должны осознавать наличие потоковобезопасных каналов связи (простой List
s, MessageQueue
s, таблицы базы данных и т.д. ...) между каждым потоком моделирования.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].