据我了解,Future将由线程池中的新线程处理。同时,主线程可以继续执行不依赖于Future结果的计算。
这来自https://www.playframework.com/documentation/2.4.x/ThreadPools,支持我的理解。
请注意,因此您可能会倾向于将阻止代码包装在Future中。这并不是说非阻塞,而是意味着阻塞将在另一个线程中发生。您仍然需要确保所使用的线程池具有足够的线程来处理阻塞。
另外,在JVM中,线程之间没有父子的概念。换句话说,所有线程均被平等对待。这意味着,即使主线程完成,寻址Future的线程也将继续运行。
但是,在下面的示例中,为什么在主线程结束时,Future线程也会被杀死。如果在示例末尾未注释掉sleep(10000),则可以看到Future结果。
val f3 = Future {
sleep(5000)
2
}
f3.onComplete {
case Success(value) => println(s"f3's result = $value")
case Failure(e) => e.printStackTrace
}
// do other work
println("A ...")
sleep(100)
println("B ...")
sleep(100)
println("C ...")
sleep(100)
println("D ...")
sleep(100)
println("E ...")
sleep(100)
println("F ...")
sleep(100)
// keep the JVM running
// sleep(10000)
def sleep(duration: Long) {
Thread.sleep(duration)
}
Run Code Online (Sandbox Code Playgroud) 为什么Scala中的print()方法有副作用?它只是阅读,而不是写.换句话说,print()不会改变任何东西.
我似乎是一个"愚蠢"的问题,但有时小事情会导致大动作.
我有两个问题:
为什么HashMap使用密钥的内存地址作为映射条目的标识符,即桶.据我所知,只要我覆盖hashCode(),密钥的哈希码将用作桶ID.
HashMap当密钥在下面的代码中发表评论时,为什么会更新:
object Equals {
def main(args: Array[String]) {
val pointX = new Point2(1, 1)
val pointY = new Point2(2, 1)
val pointZ = new Point2(4, 4)
val map = HashMap(pointX -> "X", pointY -> "Y")
println(s"Map before: $map")
//Map before: Map(oo.Point2@20 -> X, oo.Point2@3f -> Y)
pointX.move(3, 3)
println(s"Map after: $map")
//Map after: Map(oo.Point2@80 -> X, oo.Point2@3f -> Y)
println(map(pointZ))
}
}
class Point2(var x: Int, var y: Int) extends Equals {
def …Run Code Online (Sandbox Code Playgroud) 如何结合两个git命令.特别是,我想结合git add.和git commit -m"message".例如,
gaddmit "message"
Run Code Online (Sandbox Code Playgroud)
应相当于:
git add .
git commit -m "message"
Run Code Online (Sandbox Code Playgroud)
其中gaddmit是我想要使用的别名.
这些陈述有什么区别?
val numbers = List(1, 2, 3, 4)
numbers map println
// vs.
numbers map (x => println(x))
Run Code Online (Sandbox Code Playgroud)
Scala如何知道println会反复处理每个数字?
谢谢.