Ваш второй пример - более традиционная функция блокировки.
В мире типичной многопоточности Java вы используете такую функцию, чтобы блокировать поток до тех пор, пока результат не вернется.
Также в типичной Java существует более новая парадигма, называемая Реактивное программирование, которая позволяет избежать блокировки потока до тех пор, пока результат не вернется. Вместо того, чтобы просто ждать результата, вы предоставляете первоклассную функцию, которая будет выполняться при получении результата. Таким образом, на паузе не осталось потока; вместо этого к потоку, выполняющему длинную операцию, добавлено только новое событие, и когда операция завершится, это событие сработает.
Блокировка:
Thread one: --* . . . ./---
Thread two: \------*
Реактивный:
Thread one: --* (now free)
Thread two: \-------*---
Если вы исследуете Реактивное Программирование, вы найдете гораздо лучшие объяснения, которые идут вглубь.
Вернемся к вашему вопросу, однако, эти два способа сделать, казалось бы, одно и то же, являются результатом того сдвига парадигмы из мира Java. Конечно, поскольку мы здесь работаем с сопрограммами, нам не нужно беспокоиться об этой проблеме блокировки вообще ; язык заботится об этом путем приостановки вместо блокировки. Таким образом, большое преимущество программирования на реактивном уровне освобождается от уровня языка.
Однако , парадигма по-прежнему имеет свои достоинства, поэтому имеет смысл видеть людей, продолжающих работать по этой схеме, даже если это не так строго необходимо, как в других местах.