как узнать, блокируется ли метод?
Посмотрите на тип возвращаемого значения метода. Если он возвращает Future
, IO
или какое-либо другое эффективное значение F[A]
, которое охватывает чистое значение A
, способное моделировать асинхронные вычисления, то предположим, что это неблокирующая. Например, рассмотрим
def f(v: Int): Future[Int] = Future(v + 1)
def g(v: Int): IO[Int] = IO(v + 1)
Здесь f
и g
являются неблокирующими в том смысле, что поток, который вызвал их, не блокируется до тех пор, пока не будет оценена v + 1
. С другой стороны, если метод возвращает чистое значение, например
def h(v: Int): Int = v + 1
, то лучше предположить, что он блокирует. Здесь h
- это блокировка в том смысле, что поток, вызвавший его, блокируется до тех пор, пока не будет вычислено v + 1
.
Применяя этот принцип к readLine
def readLine(): String
, мы видим, что он возвращает чистое значение String
, поэтому мы предполагаем, что он блокирует. Анализируя исходный код, мы видим следующую трассировку стека
java.io.Reader#read(char[], int, int)
java.io.BufferedReader#fill
java.io.BufferedReader#readLine(boolean)
java.io.BufferedReader#readLine()
scala.io.StdIn#readLine
, где read
состояний
Считывает символы в часть массива. Этот метод будет блокировать , пока какой-либо вход не станет доступным, не произойдет ошибка ввода-вывода или не будет достигнут конец потока.