x***4 发帖数: 1815 | 1 比如说下面的code会出现dead lock的情况。实践中有什么好的practice可以防止dead
lock呢?
import scala.concurrent.{Future, Promise}
import scala.util.{Failure, Success}
import scala.concurrent.ExecutionContext.Implicits.global
val promise1: Promise[Int] = Promise()
val promise2: Promise[Int] = Promise()
val future1 = promise1.future
val future2 = promise2.future
future1 onComplete {
case success: Success[Int] => {
promise2.success(123)
println("1 complete")
}
case _ => println("1 fail")
}
future2 onComplete {
case success: Success[Int] => {
promise1.success(123)
println("2 complete")
}
case _ => println("2 fail")
} | d******e 发帖数: 2265 | 2 这个用法好新奇。能不能给个实际点的例子。
dead
【在 x***4 的大作中提到】 : 比如说下面的code会出现dead lock的情况。实践中有什么好的practice可以防止dead : lock呢? : import scala.concurrent.{Future, Promise} : import scala.util.{Failure, Success} : import scala.concurrent.ExecutionContext.Implicits.global : val promise1: Promise[Int] = Promise() : val promise2: Promise[Int] = Promise() : val future1 = promise1.future : val future2 = promise2.future : future1 onComplete {
| e***i 发帖数: 231 | 3 首先,所有的Future都会直接直接返回,不会block,所以你上述的代码会被跳过不执
行。
其次,Future说到底都最终是要执行(block)的,所谓“出来混总是要还的”。这时
Deadlock会被timeout机制打破。你的代码最后可以加上几行进行测试:
import scala.concurrent._
import scala.concurrent.duration._
println(Await.result(future1, 5 seconds))
结果是:
[error] (run-main-6) java.util.concurrent.TimeoutException: Futures timed
out after [5 seconds]
最后,deadlock是semantic的(e.g. Catch 22),不是语言本身可以消除的。 |
|