Краткий ответ: измените ваш контроллер, чтобы использовать цикл / реагировать вместо while / receive
Библиотека акторов определяет, на какой версии Java она работает, и, если это версия 1.6 (а не виртуальная машина IBM), она использует пакетную версию пула потоков объединения вилок JSR-166y, поэтому в базовом реализация в зависимости от версии Java.
Пул потоков fork / join использует своего рода двухуровневую очередь для задач. У каждого рабочего потока есть очередь, и есть общая очередь для пула. Задачи, возникающие в потоке fork / join, направляются непосредственно в очередь потока fork / join, а не через основную очередь. Кража задач между потоками используется для обеспечения занятости потоков и предотвращения голодания.
В вашем случае все задачи по запуску передач заканчиваются в очереди для потока, управляющего контроллером. Поскольку вы используете while / receive в этом акторе, он никогда не отпускает поток, поэтому он никогда не выполняет задачи непосредственно в своей очереди. Другие потоки постоянно заняты 3 передачами, поэтому они никогда не пытаются украсть работу из потока, управляющего контроллером. В результате остальные актеры снаряжения никогда не будут казнены.
Переключение на цикл / реакцию в контроллере должно решить проблему, потому что в каждом цикле субъект отпускает поток и планирует новое задание, которое заканчивается в конце очереди, поэтому другие задания в нем будут казнены.