Создание множества потоков в java

Я хочу смоделировать человеческую популяцию, и для этого я хочу назначить нить для каждого человека. (Это число должно доходить до миллиарда) Каждый поток будет вести себя индивидуально, и его конец объявит этого человека мертвым. Я реализовал это, используя простое создание потока, а также пул потоков. Но по прошествии некоторого времени распределение потоков в обоих методах просто перестает происходить. (скажем, после 150000 потоков). Я знаю, что потоки Java связаны потоками ОС в соотношении 1: 1, и это будет проблемой. Какой другой подход лучше всего смоделирует эту проблему?

Это просто неразумно. Ничего не делающий поток потребляет примерно 1 МБ ОЗУ. Для 1000 потоков потребуется 1 ГБ памяти. 1 миллиард будет означать 1 миллион ГБ или памяти. Даже если предположить, что каждый человек, которого вы хотите смоделировать, занимает всего 16 байт (это меньше, чем нужно для Integer), вам уже потребуется 16 ГБ ОЗУ. Если вы не сможете купить несколько суперкомпьютеров и нанять высококвалифицированных специалистов в этой области, вы не сможете делать то, что хотите.

JB Nizet 29.11.2018 13:21

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

Meini 29.11.2018 13:31

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

hunter 29.11.2018 14:23

@Meini Люди просто находят себе пару и производят другого человека (то есть еще одну нить) и вымирают

pankaj 29.11.2018 18:32

Это определенно выглядит плохой идеей с потоками. Я думал, что смогу поиграть с ними @JBNizet

pankaj 29.11.2018 18:34

@pankaj Если судьба ваших людей предсказуема, например время смерти уже известно в момент рождения, и когда они встречаются для воспроизведения, вам не обязательно нужно больше одного потока, вы просто отрабатываете события (например, BirthEvent, DeathEvent) на временной шкале. Хотя, поскольку в вашей симуляции миллиарды людей, было бы полезно иметь более одного рабочего потока, обращающегося к параллельной временной шкале - что-то вроде en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem. Но обратите внимание: это не моделирование в реальном времени.

Meini 30.11.2018 09:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
97
1

Ответы 1

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

В частности, akka имеет открытый исходный код и хорошо известен своей реализацией этого шаблона: https://doc.akka.io/docs/akka/2.5.3/scala/guide/actors-intro.html

Другие вопросы по теме