异步操作的有两个经典接口:Future和Promise,其中的 Future 表示一个可能还没有实际完成的异步任务的结果,针对这个结果可以添加 Callback 以便在任务执行成功或失败后做出对应的操作,而 Promise 交由任务执行者,任务执行者通过 Promise 可以标记任务完成或者失败。 可以说这一套模型是很多异步非阻塞架构的基础。
 

scala的Future表示一个异步操作的结果状态,它持有一个值,在未来的某个之间点可用,该值是异步操作的结果,当异步操作没有完成,那么Future的isCompleted为false,当异步操作完成了且返回了值,那么Future的isCompleted返回true且是success, 如果异步操作没有完成或者异常终止,那么Future的isCompleted也返回true但是是failed.scala的Future有一个重要特性,就是他只能被赋值一次,一旦Future对象被赋值了或者设置为异常,那么它会变成不可变的

 
创建一个Future最简单的方式就是调用future函数:它会启动一个异步操作且返回一个包含了操作结果的。一个future函数完成该值就可以用了,Future[T]的泛型是异步操作结果的类型。下面是一个创建Future的例子。
  1. package com.joy.lession1
  2. import scala.concurrent._
  3. importExecutionContext.Implicits.global
  4. object FutureTestextendsApp{
  5. val s ="Hello"
  6. val f:Future[String]= future {
  7. s +" future!"
  8. }
  9. f onSuccess {
  10. case msg => println(msg)
  11. }
  12. println(s)//不加这句, f onSuccess就不执行
  13. }
Future的apply()方法会构建一个异步操作且在未来某一个时刻返回一个值。Future的apply()方法内部使用了Promise。
 
下面给Future添加一个回调函数。
  1. import scala.concurrent._
  2. importExecutionContext.Implicits.global
  3. import scala.util.{Failure,Success,Try}
  4. object FutureTestextendsApp{
  5. val s ="Hello"
  6. val f:Future[String]= future {
  7. s +" future!"
  8. }
  9. f onComplete {
  10. caseSuccess(t)=>
  11. {
  12. println(t)
  13. }
  14. caseFailure(e)=>
  15. {
  16. println(s"An error has occured: $e.getMessage")
  17. }
  18. }
  19. println("dd")
  20. }
Future的值不知道什么时候可用,所以需要一种机制来获取异步操作的结果,一种是不停的查看Future的完成状态,另一个采用阻塞的方式,scala提供了第二种方式的支持,使用scala.concurrent.Await,它有两个方法,一个是Await.ready,当Future的状态为完成时返回,一种是Await.result,直接返回Future持有的结果。Future还提供了一些map,filter,foreach等操作
 
 
Scala的Promise可以被认为一个是可写的,静态单赋值,它可以创建一个Future和完成一个Future(success complete和failed complete) promise字面意思是承诺,以为他可以控制异步操作的结果
  1. import java.util.Timer
  2. import java.util.TimerTask
  3. import scala.concurrent._
  4. object TimedEvent{
  5. val timer =newTimer
  6. /** Return a Future which completes successfully with the supplied value after secs seconds. */
  7. def delayedSuccess[T](secs:Int, value: T):Future[T]={
  8. val result =Promise[T]
  9. timer.schedule(newTimerTask(){
  10. def run()={
  11. result.success(value)
  12. }
  13. }, secs *1000)
  14. result.future
  15. }
  16. /** Return a Future which completes failing with an IllegalArgumentException after secs
  17. * seconds. */
  18. def delayedFailure(secs:Int, msg:String):Future[Int]={
  19. val result =Promise[Int]
  20. timer.schedule(newTimerTask(){
  21. def run()={
  22. result.failure(newIllegalArgumentException(msg))
  23. }
  24. }, secs *1000)
  25. result.future
  26. }
 
 
 
 

scala的futue和promise的更多相关文章

  1. 编写并发程序 Inversion

    做完了 scala parallel 课程作业后,觉得 scala 写并发程序的便捷性是 java 永远都追不上的.scala 的Future 和 Promise,java 里 Future 和 Co ...

  2. Netty http client 编写总结

    Apache http client 有两个问题,第一个是 apache http client 是阻塞式的读取 Http request, 异步读写网络数据性能更好些.第二个是当 client 到 ...

  3. Monad 在实际开发中的应用

    版权归作者所有,任何形式转载请联系作者. 作者:tison(来自豆瓣) 来源:https://www.douban.com/note/733279598/ Monad 在实际开发中的应用 不同的人会从 ...

  4. Scala教程之:Future和Promise

    文章目录 定义返回Future的方法 阻塞方式获取Future的值 非阻塞方式获取Future的值 Future链 flatmap VS map Future.sequence() VS Future ...

  5. Effective Scala

    Effective Scala Marius Eriksen, Twitter Inc.marius@twitter.com (@marius)[translated by hongjiang(@ho ...

  6. Scala 并行和并发编程-Futures 和 Promises【翻译】

    官网地址 本文内容 简介 Futures 阻塞 异常 Promises 工具 最近看了<七周七语言:理解多种编程泛型>,介绍了七种语言(四种编程范型)的主要特性:基本语法,集合,并行/并发 ...

  7. 一步步实现Promise

    最近在https://github.com/ThoughtWorksInc/rest-rpc上工作,遇到了一个scala隐式转换的问题,简单的说是要实现这么个东西: implicit def json ...

  8. 为Play初学者准备的Scala基础知识

    1 前言 本文的主要目的是为了让Play Framework的初学者快速了解Scala语言,算是一篇Play Framework的入门前传吧.使用PlayFramework可以极大的提高开发效率,但是 ...

  9. scala-Future和Promise

    首先说明同步与异步,阻塞与非阻塞的问题: Asynchronous vs. Synchronous A method call is considered synchronous if the cal ...

随机推荐

  1. avalon 总线时序关系理解

    对于读,等待时间指的是从端口捕获数据的时间相对于read信号的延时 建立时间指的是read信号相对于chipselect和addr的延时时间 对于写,等待时间指的是相对于非等待情况下各个信号的延时时间 ...

  2. Yii框架的一些系统函数

    Yii::app()->request->baseUrl 返回app所在目录,可以用来挂模板. var_dump(Yii::app()->db); 可以用来测试数据库配置成功否

  3. PowerHA完全手册(二)

    http://www.aixchina.net/home/space.php?uid=1006&do=blog&id=40117 第二部分--安装配置篇2.1. 准备2.1.1. 安装 ...

  4. Linux下的Memcache安装,启动

    一.linux安装memcache 1. 如果通过下载源码进行安装,则需要下载最新版本http://memcached.googlecode.com/files/memcached-1.4.13.ta ...

  5. mina中责任链模式的实现

    一.mina的框架回顾 责任链模式在mina中有重要的作用,其中Filter机制就是基于责任链实现的. 从上图看到消息的接受从IoService层先经过Filter层过滤处理后最后交给IoHander ...

  6. Vue.js:样式绑定

    ylbtech-Vue.js:样式绑定 1.返回顶部 1. Vue.js 样式绑定 Vue.js class class 与 style 是 HTML 元素的属性,用于设置元素的样式,我们可以用 v- ...

  7. 1024 Palindromic Number

    题意: 给出一个数N(N<=10^10),最多可操作K次(K<=100),每次操作为这个数和其反转之后的数相加,若得到的结果为回文数,则输出:若在K次迭代后仍然不是回文数,在输出第K次操作 ...

  8. sublime3环境配置

    首先安装package control 按ctrl+`调出控制台,输入以下代码 import urllib.request,os; pf = 'Package Control.sublime-pack ...

  9. IDA Pro 权威指南学习笔记(五) - IDA 主要的数据显示窗口

    在默认配置下,IDA(从 6.1 版开始)会在对新二进制文件的初始加载和分析阶段创建 7 个显示窗口 3 个立即可见的窗口分别为 IDA-View 窗口.函数窗口和消息输出窗口 可以通过 View - ...

  10. C#使用protobuf

    C# protobuf的使用方法 通过.proto文件导出C#支持的.cs类文件 protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.googl ...