scala.io.StdIn.readLine() 是阻塞调用吗?

Is scala.io.StdIn.readLine() a blocking call?

scala.io.StdIn.readLine() 是阻塞调用吗?

From the docs,没有提到它是阻塞调用。

我想做这样的事情:

while(true){
    val input = scala.io.StdIn.readLine()
    input match{
        case "quit" =>
            ...
        case "stats" =>
            ...
        case _ =>
            ...
    }
}

如果不阻塞,会不会一直循环,每次都把input设为null,然后触发case _

如果它是阻塞的,为什么它没有显示在文档中?或者我在哪里可以看到它正在阻塞的定义?

一般来说,我如何知道方法是否阻塞?

how can I know whether or not a method is blocking?

查看方法的return类型。如果它是 returning FutureIO 或其他一些 effectfulF[A] 包装 A 能够对异步计算进行建模,然后假设它是非阻塞的。例如考虑

def f(v: Int): Future[Int] = Future(v + 1)
def g(v: Int): IO[Int] = IO(v + 1)

这里 fg 是非阻塞的,因为调用它们的线程在计算 v + 1 之前不会被阻塞。另一方面,如果该方法是 return 像这样的纯值

def h(v: Int): Int = v + 1

那么最好假设它是阻塞的。这里 h 在调用它的线程被阻塞的意义上是阻塞的,直到 v + 1 被计算。

将此原则应用于 readLine

def readLine(): String

我们看到它是 returning 纯值 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 表示

Reads characters into a portion of an array. This method will block until some input is available, an I/O error occurs, or the end of the stream is reached.