Я хочу смоделировать человеческую популяцию, и для этого я хочу назначить нить для каждого человека. (Это число должно доходить до миллиарда) Каждый поток будет вести себя индивидуально, и его конец объявит этого человека мертвым. Я реализовал это, используя простое создание потока, а также пул потоков. Но по прошествии некоторого времени распределение потоков в обоих методах просто перестает происходить. (скажем, после 150000 потоков). Я знаю, что потоки Java связаны потоками ОС в соотношении 1: 1, и это будет проблемой. Какой другой подход лучше всего смоделирует эту проблему?
Что делает человек в вашей симуляции? Может быть, у вас может быть несколько рабочих потоков, которые будут организовывать больше, чем один человек.
если у человека нет живой активности, не рекомендуется выделять поток для представления человека, даже если у него есть живые действия, после создания определенного количества потоков у одного человека будет несколько минут, чтобы сделать следующий вдох. так что вам следует придумать другую модель.
@Meini Люди просто находят себе пару и производят другого человека (то есть еще одну нить) и вымирают
Это определенно выглядит плохой идеей с потоками. Я думал, что смогу поиграть с ними @JBNizet
@pankaj Если судьба ваших людей предсказуема, например время смерти уже известно в момент рождения, и когда они встречаются для воспроизведения, вам не обязательно нужно больше одного потока, вы просто отрабатываете события (например, BirthEvent, DeathEvent) на временной шкале. Хотя, поскольку в вашей симуляции миллиарды людей, было бы полезно иметь более одного рабочего потока, обращающегося к параллельной временной шкале - что-то вроде en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem. Но обратите внимание: это не моделирование в реальном времени.




Вы можете взглянуть на модель акторов, которая будет более адаптирована, чем потоки в вашей ситуации.
В частности, akka имеет открытый исходный код и хорошо известен своей реализацией этого шаблона: https://doc.akka.io/docs/akka/2.5.3/scala/guide/actors-intro.html
Это просто неразумно. Ничего не делающий поток потребляет примерно 1 МБ ОЗУ. Для 1000 потоков потребуется 1 ГБ памяти. 1 миллиард будет означать 1 миллион ГБ или памяти. Даже если предположить, что каждый человек, которого вы хотите смоделировать, занимает всего 16 байт (это меньше, чем нужно для Integer), вам уже потребуется 16 ГБ ОЗУ. Если вы не сможете купить несколько суперкомпьютеров и нанять высококвалифицированных специалистов в этой области, вы не сможете делать то, что хотите.