Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中,如果某个程序的未来val未完成,该程序能否完成/退出?_Scala_Future - Fatal编程技术网

在Scala中,如果某个程序的未来val未完成,该程序能否完成/退出?

在Scala中,如果某个程序的未来val未完成,该程序能否完成/退出?,scala,future,Scala,Future,一个简单的例子来说明这个问题: 1-在这里,程序是否在未来完成后退出 def main(args: Array[String]): Unit = { val future: Future[Unit] = myFunction() } 2-如果不是,我是否应该有一个等待来保证未来终止 def main(args: Array[String]): Unit = { val future: Future[Unit] = myFunction() Await.result(futur

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

1-在这里,程序是否在未来完成后退出

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

  val future: Future[Unit] = myFunction()

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

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

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

}
阅读Scala中的未来/承诺,重点是:不是关于并发的未来

意思:阻止JVM退出的是正在运行的线程。由此引出:除非代码中的某些内容创建了一个额外的线程,以某种方式阻止JVM退出,否则您的
main()
应该简单地结束

未来是一种与内容交互的手段,这些内容在以后的某个时间点变得可用。您应该查看您的代码库,以确定采用了哪种线程,例如,如果针对正在使用的线程配置了某个底层线程池执行器。

阅读Scala中的未来/承诺,重点是:未来与并发有关

意思:阻止JVM退出的是正在运行的线程。由此引出:除非代码中的某些内容创建了一个额外的线程,以某种方式阻止JVM退出,否则您的
main()
应该简单地结束


未来是一种与内容交互的手段,这些内容在以后的某个时间点变得可用。您应该查看代码库,以确定采用了哪种线程,例如,是否针对正在使用的线程配置了某个底层线程池执行器。

A
future
是新线程(大部分)独立执行一项任务后返回的值由另一个线程(比如main)生成

要回答您的问题,即使任何
未来
仍在执行中,主线程也将退出

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
是由另一个线程(比如main)生成的新线程(大部分)独立执行任务后返回的值

要回答您的问题,即使任何
未来
仍在执行中,主线程也将退出

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")
}
输出:-
你完全正确,没有什么能阻止我测试它。然而,通过回答这个问题,我期望的不是简单的是/否答案,而是一些解释:)你完全正确,没有任何东西阻止我测试它。然而,我希望回答这个问题的不是简单的是/否答案,而是一些解释:)