Как многопоточность этого примера кода? - PullRequest
0 голосов
/ 25 августа 2011

Я хотел бы смоделировать распределенную систему и то, как машины выполняют свою работу, принятая топология является централизованной, у меня есть много небольших систем, в которых каждая подсистема принимает эту топологию, я имею в виду, что моя распределенная система состоит измного централизованных систем.Я создал простой имитатор дискретных событий, который имитирует работу в одной стороне централизованной системы, код выглядит так:

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 ]

0 голосов
/ 25 августа 2011

Я не имею в виду это как легкомысленный ответ, но: Параллелизм Java на практике , купите его сейчас ...

Но если быть более серьезным, вы теперь быстро получаетев очень волосатый сценарий тестирования.Я не верю, что вам придется использовать java.util.concurrent.ExecutorService, но если вы собираетесь общаться между потоками, вы должны осознавать наличие потоковых безопасных каналов связи (простые List s, MessageQueue s, таблицы базы данных и т. д.) между каждым потоком моделирования.

0 голосов
/ 26 августа 2011

Помимо введения тем, как уже указывалось в других ответах, ваш комментарий к ответу носителя звонка верен: вы должны позаботиться о списке событий и часах симуляции .

Насколько я понимаю, ваш пример довольно типичный моделирование дискретных событий . Попытка распараллелить их даже между потоками, т. Е. В одном адресном пространстве (выполняемом одной и той же JVM на одной машине, которая может иметь несколько ядер и т. Д.), Не совсем тривиальна. Я бы посоветовал вам начать с прочтения вводного материала по этому вопросу (я бы порекомендовал эту книгу ).

Ваша основная проблема заключается в том, что вы не можете предотвратить выполнение некоторых потоков быстрее, чем другие (например, из-за того, что им приходится обрабатывать меньшую нагрузку), и, следовательно, их локальные часы могут перейти в симулированное «будущее». Если один из других потоков, то есть поток, который отстает, теперь выпускает новое событие / сообщение, которое должно было бы быть обработано одним потоком, который продвинулся слишком далеко во времени, все сломается (или тихо завершится неудачей и будет недействительным) , Подумайте об открытии вашего почтового ящика сегодня и получении сообщения из прошлого года, на которое вы также должны были немедленно ответить ...

Алгоритмы, предотвращающие возникновение таких ситуаций, называются алгоритмами синхронизации . Существует два основных варианта: оптимистические методы позволяют совершать такие события-бродяги (сообщения из прошлого), но обнаруживают их и при необходимости устраняют любые несоответствия. В вашем случае, тем не менее, рекомендуется сначала взглянуть на консервативные алгоритмы, которые вообще избегают таких методов. Их (как правило) легче реализовать, но они работают хорошо, только если между отправителем события и временем его выполнения есть определенные задержки (например, см. в этой классической статье или подробнее это более поздняя , детализирующая систему моделирования на основе Java, которая использует консервативную синхронизацию). Если у вас есть алгоритм синхронизации, он также будет управлять вашими местными часами симуляции.

Поскольку реализация этих алгоритмов отнимает много времени, вы также можете рассмотреть возможность использования некоторой среды моделирования на основе Java или библиотеки, которая уже предоставляет методы (это хорошо известная проблема).

0 голосов
/ 25 августа 2011

На самом базовом уровне все, что вам нужно сделать, это сделать SimuleOnesystem Thread или Runnable - а затем из программы-драйвера, такой как метод main, создать столько потоков, сколько вам нужно.и start им.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...