经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Scala » 查看文章
Scala Future
来源:cnblogs  作者:afewnotes  时间:2019/10/8 9:28:37  对本文有异议

Future

  • scala.concurrent.Future 异步执行代码块

    1. import java.time._
    2. import scala.concurrent._
    3. import ExecutionContext.Implicits.global // 全局线程池
    4. Future {
    5. Thread.sleep(10000)
    6. println(s"This is the future at ${LocalTime.now}")
    7. }
    8. println(s"This is the present at ${LocalTime.now}")
  • 监听结果(阻塞)

    1. import scala.concurrent.duration._
    2. val f = Future { Thread.sleep(10000); 42 }
    3. val result = Await.result(f, 10.seconds) //阻塞10s
    4. val f = Future { ... }
    5. Await.ready(f, 10.seconds)
    6. val Some(t): Option[Try[T]] = f.value
    7. t match {
    8. case Success(v) => println(s"The answer is $v")
    9. case Failure(ex) => println(ex.getMessage)
    10. }

ready()

  • 到达等待时间无结果时,会抛出异常 TimeoutException
  • 任务抛出的异常时,result() 会再次抛出异常, ready() 可获取结果
  • 回调

    1. val f = Future {
    2. Thread.sleep(10000)
    3. if (random() < 0.5) throw new Exception
    4. 42
    5. }
    6. f.onComplete {
    7. case Success(v) => println(s"The answer is $v")
    8. case Failure(ex) => println(ex.getMessage)
    9. }
  • 问题:1.回调地狱;2.执行顺序无法预知

    1. val future1 = Future { getData1() }
    2. val future2 = Future { getData2() }
    3. future1 onComplete {
    4. case Success(n1) =>
    5. future2 onComplete {
    6. case Success(n2) => {
    7. val n = n1 + n2
    8. println(s"Result: $n")
    9. }
    10. case Failure(ex) => ...
    11. }
    12. case Failure(ex) => ...
    13. }

    将 Future 看作集合

    1. // val 会立即执行,def 调用时执行
    2. val future1 = Future { getData1() }
    3. val future2 = Future { getData2() }
    4. // 都获取到结果时,才会进行计算
    5. val combined = for (n1 <- future1; n2 <- future2) yield n1 + n2
  • Promise
    • 与 Java 8 中的 CompletableFuture 类似
    • Future 只读,在任务完成时隐式设置结果值;Promise 类似,但结果值可显式设置

      1. // Future
      2. def computeAnswer(arg: String) = Future {
      3. val n = workHard(arg)
      4. n
      5. }
      6. // Promise
      7. def computeAnswer(arg: String) = {
      8. val p = Promise[Int]()
      9. Future {
      10. val n = workHard(arg)
      11. // 显式设置结果
      12. p.success(n)
      13. workOnSomethingElse()
      14. }
      15. // 立即返回该 Promise 对应的 Future
      16. p.future
      17. }
      18. // 多个任务对应一个 Promise
      19. val p = Promise[Int]()
      20. Future {
      21. var n = workHard(arg)
      22. // 若 Promise 未完成则接受结果并返回 true;否则忽略结果并返回 false
      23. p.trySuccess(n)
      24. }
      25. Future {
      26. var n = workSmart(arg)
      27. p.trySuccess(n)
      28. }
  • 执行上下文
    • 默认执行在全局的 fork-join 线程池(默认大小为核数),适用于计算密集型任务
    • 对于阻塞型/IO密集型的任务,可使用 Java 的 Executors

      1. // 隐式声明,或者使用 Future.apply 显式声明
      2. val pool = Executors.newCachedThreadPool()
      3. implicit val ec = ExecutionContext.fromExecutor(pool)
      4. val f = Future {
      5. val url = ...
      6. blocking {
      7. val contents = Source.fromURL(url).mkString
      8. ...
      9. }
      10. }

原文链接:http://www.cnblogs.com/yuanzam/p/11629343.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号