Обратите внимание, что numberOf (players)! = numberOf (threads).
Вы должны создать актера для каждого объекта, который в противном случае передавал бы изменяемое состояние по потокам. Все, что касается модели актера, заключается в том, что оно должно изолировать изменчивое состояние, чтобы обменяться между ними были только неизменные сообщения. В результате вам больше не нужны блокировки, и вы можете легко рассуждать о безопасности потоков вашей программы, потому что все изменчивое состояние изолировано в актерах, и вы можете полагаться на структуру, чтобы должным образом передавать барьер памяти, когда это необходимо, например. при переключении актера из одного потока в другой.
Число потоков - это другой вопрос: это зависит от количества ядер и коэффициента блокировки для каждого потока, то есть от процента времени, которое он проводит, ожидая других потоков или подсистемы ввода-вывода. Например, если ваши актеры выполняют интенсивные вычисления ЦП (например, вычисляют Pi), тогда коэффициент блокировки будет близок к 0%. Если, однако, ваши актеры занимаются в основном I/O, вы можете легко принять коэффициент блокировки 90% или более.
Наконец, число потоков может быть вычислено следующим образом:
int threads = Runtime.getRuntime().availableProcessors() * 100/(100 - blockingCoefficient)
, где blockingCoefficient представляет собой целое число в процентах от 0 до 99 включительно.
Весь вопрос о выполнении операций блокировки в акковых акках немного запутанен: не предполагается, что они создадут выделенные потоки для таких операций блокировки и сохраняют строго запрещенные действия актеров, блокирование? Или также приемлемо полагаться на управление потоками Akka для этого? –