在 Scala 中,如果他的 Future val 之一未完成,程序可以 finishes/exits 吗?

In Scala, can a program finishes/exits if one of his Future val is unfinished?

一个简单的例子来说明问题:

1 - 在这里,程序是否在 future 完成后退出?

def main(args: Array[String]): Unit = {

  val future: Future[Unit] = myFunction()

}

2 - 如果不是,我是否应该有一个 Await 来保证未来终止?

def main(args: Array[String]): Unit = {

  val future: Future[Unit] = myFunction()
  Await.result(future, Inf)

}

在 Scala 中阅读 this 关于 Futures/Promises 的内容,重点是: 而不是 关于 并发 .

含义:阻止 JVM 退出 的是 运行 个线程。来自那里:除非 something 在你的代码中创建一个额外的线程以某种方式阻止 JVM 退出,你的 main() 应该简单地结束。

Futures 是一种与稍后可用的内容进行交互的方式。您应该查看您的代码库以确定采用哪种线程,例如,是否针对它正在使用的线程配置了一些底层线程池执行程序。

A​​ future 是由另一个线程(比如主线程)生成的新线程(主要)独立执行一项任务后返回的值。

回答你的问题主线程将退出,即使任何future仍在执行中。

import scala.concurrent._
import ExecutionContext.Implicits.global
object TestFutures  extends  App{

  def doSomeOtherTask = {
    Thread.sleep(1000) //do some task of 1 sec
    println("Completed some task by "+Thread.currentThread().getName)
  }

  def returnFuture : Future[Int]= Future{
    println("Future task started "+Thread.currentThread().getName)
    Thread.sleep(5000) //do some task which is 5 sec
    println("Future task completed "+Thread.currentThread().getName)
    5
  }
    val x = returnFuture //this takes 5 secs
    doSomeOtherTask  // ~ 1 sec job
    println(x.isCompleted)
    doSomeOtherTask // ~ 2 sec completed
    println(x.isCompleted)
    doSomeOtherTask // ~ 3 sec completed
    println(x.isCompleted)
    println("Future task is still pending and main thread have no more lines to execute")
}

输出:-

Future task started scala-execution-context-global-11
Completed some task by main
false
Completed some task by main
false
Completed some task by main
false
Future task is still pending and main thread have no more lines to execute