scala.io.StdIn.readLine()是否为阻止调用?

问题描述 投票:0回答:1

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

[From the docs,没有提及它是阻止呼叫。

我想做这样的事情:

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

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

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

通常,我如何知道某个方法是否正在阻塞?

scala blocking
1个回答
1
投票

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

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

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

这里fg是非阻塞的,这是因为调用它们的线程直到评估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错误或流已到达。
© www.soinside.com 2019 - 2024. All rights reserved.