Здравствуйте, reversecode, Вы писали:
r> не совсем понятно в техническом плане что там они такого сделали
Возможность подменять стеки на уровне рантайма. И собственно всё.
r> если в эршланге вытесняющий атом то в яве сделали каждую инструкцию что ли
r> ну т.е. как в обычном cpu где ОС каждый поток может прервать в любой момент
Виртуальные треды перешедулятся на реальные треды в момент всяких многопоточных действий, типа locks, yield, sleep и т.п. Если виртуальный тред будет внутри себя крутить вычислительный цикл, то он займёт реальный тред. Т.е. кооперативная многозадачность или асинк с человеческим лицом.
Когда в при исполнении кода виртуального треда происходил блокировка/етс — стек сохраняется в куче, и добавляется таск в шедулер на продолжение. Шедулер берёт очередной таск, восстанавливает стек и монтирует его на реальный тред. И так по кругу.
Сами стеки — это маленькие кусочки порядка сотни байт.
r> времени разбираться нет
r> так что если будет инфа о технических подробностях, закидывайте сюда
Собственно кроме свопа стека ничего магического нет. Это не магия компилятора, не изменение в языке, никаких новых ключевых слов или конструкций не появилось, а просто библиотечное расширение существующих API в JDK.
Есть ограничения, конечно, типа того, что нативный вызов требует реального треда (по очевидным причинам). Но такое, как я понимаю неизбежно и везде.
r> рано или поздно народ конечно разберет все на кусочки в статьях и докладах
Тут небольшая статья:
https://blog.rockthejvm.com/ultimate-guide-to-java-virtual-threads/
r> как го и его шедуллер который затянули и в котлин и в раст как минимум
r> ну и в эршланге он там почти такой же только сильно наговнокоден
Нет никакого специального нового магического шедулера. Используется уже давно существующий
ForkJoinPool.
Честно говоря, я сам ещё нигде это не пытался применить (вроде как уже доступно как preview), но по демкам в интернете выглядит хорошо.