scala.io.StdIn.readLine()是阻止调用吗?
[From the docs,没有提及它是阻止呼叫。
我想做这样的事情:
while(true){
val input = scala.io.StdIn.readLine()
input match{
case "quit" =>
...
case "stats" =>
...
case _ =>
...
}
}
如果没有阻塞,它将不断循环,将输入设置为null,并每次触发case _吗?
如果被阻止,为什么它没有显示在文档中?还是在哪里可以看到定义被阻止的定义?
通常,我如何知道某个方法是否正在阻塞?
我怎么知道方法是否被阻塞?
查看方法的返回类型。如果返回的是Future
,IO
或其他一些effectful值F[A]
,该值包装了能够建模异步计算的pure值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
的位置
将字符读入数组的一部分。此方法将block
直到某些输入可用,发生I / O错误或流已到达。