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