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

Gim*_*411 1 scala blocking

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

从文档中,没有提到它是一个阻塞调用。

我想做这样的事情:

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

如果它不阻塞,它会不断循环,将输入设置为空,并每次触发case _吗?

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

一般来说,我怎么知道一个方法是否阻塞?

Mar*_*lic 5

我怎么知道一个方法是否阻塞?

查看方法的返回类型。如果它返回FutureIO或一些其它effectfulF[A]是一个包装了A能够模拟异步计算的,则假设它是非阻塞的。例如考虑

def f(v: Int): Future[Int] = Future(v + 1)
def g(v: Int): IO[Int] = IO(v + 1)
Run Code Online (Sandbox Code Playgroud)

从调用它们的线程的意义上来说,这里fg是非阻塞的,直到v + 1被评估才被阻塞。另一方面,如果该方法像这样返回纯值

def h(v: Int): Int = v + 1
Run Code Online (Sandbox Code Playgroud)

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

将此原则应用于 readLine

def readLine(): String
Run Code Online (Sandbox Code Playgroud)

我们看到它正在返回纯值,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
Run Code Online (Sandbox Code Playgroud)

read

将字符读入数组的一部分。此方法将阻塞, 直到某些输入可用、发生 I/O 错误或到达流的末尾。