int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 10) ;
Это правда, что для чисто событийного актора его код реакции выполняется в том же потоке, что и код отправки сообщения.
Но в Scala, поскольку нежелательно блокировать поток когда актор вызывает блокирующую операцию внутри своего кода реакции и объединяет акторов, основанных на событиях и потоках (имея возможность их составлять), оба типа акторов используют один и тот же пул потоков, но акторы, основанные на потоках, получают свои собственные потоки, тогда как акторы на основе событий совместно используют потоки на основе очереди задач. Подробнее см. Актеры, объединяющие темы и события Филиппа Халлера и Мартина Одерски
Не предполагайте отдельную нить для каждого Актера. Механизм Scala создает пул рабочих потоков и увеличивает этот пул только в том случае, если размер «заблокированных» субъектов больше, чем размер пула. Когда ваш актер вызывает receive
, он находится в заблокированном состоянии, пока не получит свое сообщение.
Библиотека планировщика использует пул потоков для управления выполнением акторов. Я не знаю особенностей используемой в нем логики, но мне кажется естественным ожидать, что он:
Инициализируется более чем с одним потоком в пуле, поскольку многопоточные приложения, скорее всего, будут использовать больше, чем one thead.
Выберите поток, который будет использоваться с ожидающим субъектом в порядке очереди - потоки освобождаются до конца очереди и захватываются с начала очереди.
Также я предполагаю некоторые потоки используются для обработки самого планирования, а также передачи сообщений.