在Scala中,如果某个程序的未来val未完成,该程序能否完成/退出?
一个简单的例子来说明这个问题: 1-在这里,程序是否在未来完成后退出在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
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")
}
输出:-
你完全正确,没有什么能阻止我测试它。然而,通过回答这个问题,我期望的不是简单的是/否答案,而是一些解释:)你完全正确,没有任何东西阻止我测试它。然而,我希望回答这个问题的不是简单的是/否答案,而是一些解释:)