Вы тестируете два совершенно разных кода. Давайте рассмотрим Java, например:
while (true) {
Где есть возможность для других "актеров" взять на себя управление потоком и выполнить свою собственную обработку? Этот "актер" в значительной степени затягивает нить. Если вы создадите 100000 из них, вы увидите, как JVM сокрушится под тяжестью конкурирующих «актеров», или увидите, как некоторые получают все время обработки, в то время как другие томятся.
Event event = queue.take();
if (event == sentinel) {
Почему вы вынимаете событие из очереди, не проверяя, может ли оно быть обработано или нет? Если это не может быть обработано, вы потеряете событие. Если вы добавили его обратно в очередь, он закончится после других событий, отправленных тем же источником.
Это всего лишь две вещи, которые делает код Scala, а Java - нет.