|
|
От: |
Serginio1
|
https://habrahabr.ru/users/serginio1/topics/ |
| Дата: | 13.01.26 09:04 | ||
| Оценка: | |||
Если поток сталкивается с блокирующим вызовом, он продолжает выполняться нормально, если он является платформенным потоком. Однако, если это виртуальный поток (и, следовательно, временно смонтированный на несущем потоке), то среда выполнения просто диспетчеризирует операцию ввода-вывода, а затем завершает работу, отсоединяя виртуальный поток от носителя.
Помните, что в Java 15 и более поздних версиях ввод/вывод выполняется неблокирующим образом, согласно JEP 353 и JEP 373. Поэтому носитель теперь может свободно монтировать другой виртуальный поток и продолжать выполнение, пока блокирующий ввод/вывод из первого виртуального потока выполняется в фоновом режиме.
Планировщик на уровне ВМ не будет перепланировать заблокированный виртуальный поток до тех пор, пока операция ввода-вывода не будет завершена и не появятся данные для получения.
На сегодняшний день большинство распространенных операций блокировки были адаптированы для поддержки виртуальных потоков. Однако некоторые операции, такие как Object.wait(), пока не поддерживаются и, наоборот, захватывают несущий поток . В этом случае пул потоков реагирует временным увеличением числа потоков платформы в пуле, чтобы компенсировать захваченный поток.