在学习Scala的并发包中的Future对象时,遇到的一个有意思的bug,现记录如下,并给出修正后的结果及分析bug出现原因。
先上代码:
package cha17
import java.lang
import java.time._
import scala.concurrent._
import ExecutionContext.Implicits.global
class Test_17 {
}
object Test_17 {
def main(args: Array[String]): Unit = {
Future {
Thread.sleep(10000)
println(s"This is the future at ${LocalTime.now()}")
}
println(s", This is the present at ${LocalTime.now()}")
}
}
运行结果和预想中的情况并不一样:Future代码块的内容并不会被执行!只会输出
:This is the present at 现在的时间。
一个很简单地修正这个bug的方法如下,同样放上源码:
package cha17
import java.lang
import java.time._
import scala.concurrent._
import ExecutionContext.Implicits.global
class Test_17 {
}
object Test_17 {
def main(args: Array[String]): Unit = {
Future {
Thread.sleep(10000)
println(s"This is the future at ${LocalTime.now()}")
}
println(s", This is the present at ${LocalTime.now()}")
scala.io.StdIn.readLine()
}
}
另一方面,如果像如下的代码这样不写main函数及定义伴生对象Test_17的话,是可以在REPL环境下用:load命令运行的。
import java.time._
import scala.concurrent._
import ExecutionContext.Implicits.global
Future {
Thread.sleep(10000)
println(s"This is the future at ${LocalTime.now()}")
}
println(s", This is the present at ${LocalTime.now()}")
运行结果如下:
image.png
网友评论