为什么这个简单的理解Scala不能执行未来?
我一直在想为什么这样不行:为什么这个简单的理解Scala不能执行未来?,scala,future,for-comprehension,Scala,Future,For Comprehension,我一直在想为什么这样不行: import scala.concurrent.future import scala.concurrent.Future import scala.concurrent.ExecutionContext import scala.concurrent.ExecutionContext.Implicits.global object FutureTest { def main(args: Array[String]) { val result1 =
import scala.concurrent.future
import scala.concurrent.Future
import scala.concurrent.ExecutionContext
import scala.concurrent.ExecutionContext.Implicits.global
object FutureTest {
def main(args: Array[String]) {
val result1 = future("a")
val result2 = future("b")
val result3 = future("c")
val res = for {
r1 <- result1
r2 <- result2
r3 <- result3
} yield (r1 + r2 + r3)
for { r <- res} yield(println(r))
}
}
导入scala.concurrent.future
导入scala.concurrent.Future
导入scala.concurrent.ExecutionContext
导入scala.concurrent.ExecutionContext.Implicits.global
目标未来测试{
def main(参数:数组[字符串]){
val result1=未来(“a”)
val result2=未来(“b”)
val result3=未来(“c”)
val res=用于{
r1您正在执行一个独立的程序,问题是主线程在将来可以完成之前被终止,要查看您可以使用以下内容:
import scala.concurrent.future
import scala.concurrent.Future
import scala.concurrent.ExecutionContext
import scala.concurrent.ExecutionContext.Implicits.global
object FutureTest {
def main(args: Array[String]) {
val result1 = future("a")
val result2 = future("b")
val result3 = future("c")
val res = for {
r1 <- result1
r2 <- result2
r3 <- result3
} yield (r1 + r2 + r3)
val printing = for { r <- res} yield(println(r))
Await.ready(printing, Duration.Inf)
}
}
导入scala.concurrent.future
导入scala.concurrent.Future
导入scala.concurrent.ExecutionContext
导入scala.concurrent.ExecutionContext.Implicits.global
目标未来测试{
def main(参数:数组[字符串]){
val result1=未来(“a”)
val result2=未来(“b”)
val result3=未来(“c”)
val res=用于{
r1在我的例子中打印“abc”…我修复了这个问题,添加了一个等待结果(res,3分钟),其中res是从for分配的val。不知何故,我希望程序自动无限期等待期货终止。显然这没有发生。我在您回答之前找到了类似的解决方案(请参阅问题的第二条注释)。但是,是的,我同意这是解决方案。如果是这样的话,期货可能就没有用了,因为主线程可能会无限期地阻止等待未来的结果:我同意期货一般应该是异步的,但至少主线程可以在终止前等待任何未完成的期货。我猜!@sscarduzio这是更多关于ExecutionContext而非Futures的信息。您可以提供自己的ExecutionContext,它使用非守护进程线程。