Полнейшая глупость! На данный момент: а по хорошему уже лет 10 минимум, существует куча асинхронных фреймворков и сетевых библиотек, которые работают ровно на том же самом принципе, как и nodejs.
Примеров, у нас их есть:
- фреймворки jooby.org, sparkjava, springboot
- библиотеки (серверы) netty, undertow, akka
По производительности ничуть не уступают nodejs.
Ну а как все это работает? Есть два вида программирования, которые можно совмещать:
Старый и много кем используемый
- сервер ждет сетевое соединение
- как только соединение произошло, сервер запускает процесс/поток и ему передает открытое соединение.
В этом случае мы ограничены количеством потоков/процессов в системе, имеем большой оверхед на создание процесса/потока. Зато нам не нужно сильно заботиться о работе с сокетами.
Новый хайповый/модерновый
- при старте в сервере региструются обработчики данных (наши сервисы/приложения)
- сервер открывает сокет и слушает все открытые им ранее сокеты, висит в ожидании события прихода/передачи данных на методе select/poll/epoll или побобном.
- как только сервер получил ответ, он вызывает зарегистрированный обработчик и передает туда порцию полученных данных, принимает эти данные обратно и и отправляет в сеть на нужное соединение
В этом случае сервер работает в один поток, просто последовательно вызывая обработчики и отдавая им данные. Быстро, очень быстро, ловко, нет накладных расходов. Зато, если какой обработчик пытается сделать блокирующую операцию - виснут все остальные обработчики, поэтому обработчики с сервером общаются сообщениями и стараются не занимать много процессорных ресурсов. Программирование получается сложное.
Также можно совмещать эти два подхода, делая и пул потоков и работая в асинхронном режиме.
На почитать сюда например -
https://ru.wikipedia.org/wiki/Epoll