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 _吗?
如果它被阻止,为什么它没有显示在文档中?或者我在哪里可以看到说它是阻塞的定义?
一般来说,我怎么知道一个方法是否阻塞?
我怎么知道一个方法是否阻塞?
查看方法的返回类型。如果它返回Future,IO或一些其它effectful值F[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)
从调用它们的线程的意义上来说,这里f和g是非阻塞的,直到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 错误或到达流的末尾。