Scala 为什么这个未来没有实现?
鉴于此代码:Scala 为什么这个未来没有实现?,scala,Scala,鉴于此代码: object Test { import scala.concurrent.ExecutionContext.Implicits.global def main(args: Array[String]): Unit = { val f: Future[String] = Future { "Test" } f.onComplete { case Success(name) => println(nam
object Test {
import scala.concurrent.ExecutionContext.Implicits.global
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => println(name)
case Failure(t) => t.printStackTrace()
}
}
}
我看不到任何输出,但是将println更改为System.out.println有效:
object Test {
import scala.concurrent.ExecutionContext.Implicits.global
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => System.out.println(name)
case Failure(t) => t.printStackTrace()
}
}
}
将println与标准线程一起使用也可以:
object Test {
def main(args: Array[String]): Unit = {
val t = new Thread() {
override def run(): Unit = println("Test")
}
t.start()
t.join()
}
}
为什么会这样?因为您的程序已退出:
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => println(name)
case Failure(t) => t.printStackTrace()
}
Thread.sleep(100)
}
因为您的程序已退出:
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => println(name)
case Failure(t) => t.printStackTrace()
}
Thread.sleep(100)
}
您必须等待
将来的完成。所以您的System.out.println
版本也可能输出或不输出
object Test {
import scala.concurrent.ExecutionContext.Implicits.global
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => println(name)
case Failure(t) => t.printStackTrace()
}
Await.result(f)
}
}
您必须等待将来的完成。所以您的System.out.println
版本也可能输出或不输出
object Test {
import scala.concurrent.ExecutionContext.Implicits.global
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => println(name)
case Failure(t) => t.printStackTrace()
}
Await.result(f)
}
}
Future和onComplete在独立的守护进程线程中执行。当主线程终止时(在最后一条指令之后),守护进程线程也会终止。在您的情况下,他们没有时间执行代码。使主代码长寿,例如,Thread.sleep(100)
Future和onComplete在独立的守护进程线程中执行。当主线程终止时(在最后一条指令之后),守护进程线程也会终止。在您的情况下,他们没有时间执行代码。让你的主代码长寿,例如,Thread.sleep(100)
,所以答案似乎就在这里。Scala的println不是System.out.println的别名,而是Console.println,它以不同的方式处理线程,因此答案似乎在于。Scala的println不是System.out.println的别名,而是Console.println,它以不同的方式处理线程这是有道理的,但我仍然不明白为什么System.out.println可以工作而println不能工作?我测试了100次,每次System.out.println工作时,但println不工作。据我所知,println只是System.out.println的别名。我意识到线程是不确定的,但我不相信我的结果是一个简单的巧合,这是有意义的,但我仍然不明白为什么System.out.println起作用而println不起作用?我测试了100次,每次System.out.println工作时,但println不工作。据我所知,println只是System.out.println的别名。我意识到线程是不确定的,但我不相信我的结果是简单的巧合。我知道这已经有点晚了,但您能否在scala文档中提供“在分离的守护进程线程中执行未来和未完成”的参考?我找不到说明这一点的规范。我知道这有点晚了,但您能否在scala文档中提供对“Future and onComplete在分离的守护进程线程中执行”的参考?我无法找到说明这一点的规范。