Await.result还是只是一个简单的电话?

アレッ*_*ックス 1 multithreading scala future

我正在努力解决这个问题futures.这两者之间有很大的不同吗?

//1
import scala.concurrent.Await
import scala.concurrent.Future
import scala.concurrent.duration._

def longRequestToServer(): String = {...}
val future = Future { longRequestToServer() }
val resultAsync = Await.result(future, 60.seconds)
Run Code Online (Sandbox Code Playgroud)

//2 
val resultSync = try {
  longRequestToServer()
} catch {
  case _: Exception => "???"
}
Run Code Online (Sandbox Code Playgroud)

除了60 seconds第一种情况的时间段.

som*_*ytt 14

封锁是邪恶的.

在将来阻塞然后等待结果会消耗两个线程而不是一个线程.

那是邪恶的两倍吗?

这是你想要避免的拦截电话.

(将来,你至少要把它包裹起来,blocking使它成为邪恶的一半.精确的比例实际上是.666邪恶.)

编辑:要考虑的其他因素是两个版本在关闭时可能有不同的行为.在第一种情况下,未来可以被拒绝.协调这些影响,尤其是多个自定义执行程序和回调,相对微妙且容易出错.(这是人们更喜欢演员的未来.)

(早期,所有throwable的期货并不完全健壮,因此您可能无法在工作线程上看到错误,但AFAIK已修复.)