首先说明同步与异步,阻塞与非阻塞的问题:

Asynchronous vs. Synchronous

A method call is considered synchronous if the caller cannot make progress until the method returns a value or throws an exception. On the other hand, an asynchronous call allows the caller to progress after a finite number of steps, and the completion of the method may be signalled via some additional mechanism (it might be a registered callback, a Future, or a message).

A synchronous API may use blocking to implement synchrony, but this is not a necessity. A very CPU intensive task might give a similar behavior as blocking. In general, it is preferred to use asynchronous APIs, as they guarantee that the system is able to progress.

Non-blocking vs. Blocking

We talk about blocking if the delay of one thread can indefinitely delay some of the other threads. A good example is a resource which can be used exclusively by one thread using mutual exclusion. If a thread holds on to the resource indefinitely (for example accidentally running an infinite loop) other threads waiting on the resource can not progress. In contrast, non-blocking means that no thread is able to indefinitely delay others.

Non-blocking operations are preferred to blocking ones, as the overall progress of the system is not trivially guaranteed when it contains blocking operations.

以上文献摘自akka文档,一个方法之所以被称为同步方法,是因为直到该方法返回某值或者抛出异常,该方法的调用者才能得到结果(make progress)。如果一个异步调用需要通过额外的机制(比如callback,Future,message)。如果一个线程的延迟导致了另一个(一些)线程的延迟,那么久出现了阻塞(blocking)。一个例子就是一个资源被一个线程所独占,那么其他线程需要等待这个线程释放资源才能继续执行。

scala中的FuturePromise都是非阻塞的执行,既可以通过回调函数获取结果,但是也可以通过阻塞的方法串行获取结果。

Future

一个Future会持有一个值,虽然这个值在将来某个时间点才可用。

  1. 如果计算未完成,那么这个Future就未完成。
  2. 如果计算完成(得到结果或者异常),这个Future就完成了。

Future只能被指派一次,一旦Future给定了一个值或异常,它的结果不能修改。

object Main extends App {
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
val f:Future[Int]=Future{
Thread.sleep(100)//模拟某个耗时操作 比如网络请求
println("haha")
10
}
Thread.sleep(1000)
}
//haha

异步方法获取结果

目的获取结果,而不是控制执行过程。

scala提供了onSuccess等回调函数。其签名为:def onComplete[U](f: Try[T] => U)(implicit executor: ExecutionContext): Unit

f.onComplete({
case Success(i) => println(i)
case Failure(e) => e.printStackTrace()
})

以上代码采用偏函数形式,或者:

  f.onComplete(result=>result match {
case Success(i)=>println(i)
case Failure(e)=>e.printStackTrace()
})

还可以注册多个回调:

f.onComplete(result=>result match {
case Success(i)=>println(i)
})
f.onComplete(result=>result match {
case Success(i)=>println(i+20)
})

注:多个回调函数之间并不保证执行顺序

同步方法获取结果

通过Await.result可以同步获取结果,或者超时或者异常。Await.ready等待计算完成,不返回结果。

val r=Await.result(f,Duration.Inf) //Await.result(f,1 seconds)

Promise

除了通过Future.apply创建Future对象,还可以使用Promise.future。如果说Future是一个只读的,值还没计算的占位符。那么Promise就是一个可写的,单次指派的容器。Promise可以通过调用success代表Future成功完成,failure方法抛出异常。或者更抽象的complete

object Main extends App {
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Future,Promise}
// import scala.concurrent.duration._
val p=Promise[Int]
val f=p.future
val producer=Future{
p complete Try{
100
}
}
val consumer=Future{
f onComplete{
case Success(i)=>println(i)
case Failure(e)=>e.printStackTrace()
}
}
Thread.sleep(1000)
}

scala-Future和Promise的更多相关文章

  1. [转] Scala Async 库 (Scala future, await, async)

    [From] https://colobu.com/2016/02/15/Scala-Async/ 在我以前的文章中,我介绍了Scala Future and Promise.Future代表一个异步 ...

  2. Scala教程之:Future和Promise

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

  3. Future与Promise

    https://code.csdn.NET/DOC_Scala/chinese_scala_offical_document/file/Futures-and-Promises-cn.md#ancho ...

  4. SDP(13): Scala.Future - far from completion,绝不能用来做甩手掌柜

    在前面几篇关于数据库引擎的讨论里很多的运算函数都返回了scala.Future类型的结果,因为我以为这样就可以很方便的实现了non-blocking效果.无论任何复杂的数据处理操作,只要把它们包在一个 ...

  5. C++之future和promise

    future和promise的作用是在不同线程之间传递数据.使用指针也可以完成数据的传递,但是指针非常危险,因为互斥量不能阻止指针的访问:而且指针的方式传递的数据是固定的,如果更改数据类型,那么还需要 ...

  6. Netty 中的异步编程 Future 和 Promise

    Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...

  7. Netty 源码解析(三): Netty 的 Future 和 Promise

    今天是猿灯塔“365篇原创计划”第三篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel 当前:Ne ...

  8. Future和Promise

    Future用于获取异步操作的结果,而Promise则比较抽象,无法直接猜测出其功能. Future Future最早来源于JDK的java.util.concurrent.Future,它用于代表异 ...

  9. C++11多线程のfuture,promise,package_task

    一.c++11中可以在调用进程中获取被调进程中的结果,具体用法如下 // threadTest.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" ...

  10. C++并发编程之std::async(), std::future, std::promise, std::packaged_task

    c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...

随机推荐

  1. Sublime Text 3 修改配色方案

    你可能会觉得 Sublime Text 配色方案的颜色(注释.背景色)看起来不习惯,其他都满意.此时我们可以自己修改这些配色,不需要更换整个配色方案. 需要安装 PackageResourceView ...

  2. Spring学习笔记(二)之装配Bean

    一,介绍Bean的装配机制 在Spring中,容器负责对象的创建并通过DI来协调对象之间的关系.但是我们要告诉Spring创建哪些Bean并且如何将其装配在一起.,装配wiring就是DI依赖注入的本 ...

  3. 秒表计时器以及Stopwatch

    Stopwatch:秒表计时器,用来记录程序的运行时间,通常用来测试代码在时间上的执行效率.(需要引用:System.Diagnostics.) Stopwatch sw=new Stopwatch( ...

  4. 《java.util.concurrent 包源码阅读》28 Phaser 第二部分

    这一部分来分析Phaser关于线程等待的实现.所谓线程等待Phaser的当前phase结束并转到下一个phase的过程.Phaser提供了三个方法: // 不可中断,没有超时的版本 public in ...

  5. JavaScript的简单继承实现案例

    <html><body><script> //实现JavaScript继承的步骤: //1:写父类 //2:写子类 //3:用Object.create()来实现继 ...

  6. Android开发过程中使用弱引用解决内存泄露的习惯

    Java虽然有垃圾回收,但是仍然存在内存泄露,比如静态变量.缓存或其他长生命周期的对象引用了其他对象,这些被引用的对象就会长期不能被GC释放,导致内存泄露. 弱引用(WeakReference)是解决 ...

  7. springboot-helloworld

    1使用idea创建springboot项目如下图所示 并选择web模块 2,登录springboot官网 http://projects.spring.io/spring-boot/ 引入相关依赖包如 ...

  8. web兼容性测试相关知识

    一.客户端兼容性 1.浏览器的兼容性测试 a.内核角度 Tridnt内核:代表作IE.腾讯.遨游.世界之窗等 Gecko内核:代表作Firefox webkit内核:代表作Safari.Chrome ...

  9. Openssl 生成证书server.key and server.crt

    1.key的生成 openssl genrsa -des3 -out server.key 2048 这样是生成rsa私钥,des3算法,openssl格式,2048位强度.server.key是密钥 ...

  10. javascript算法题判断输入年份是否是闰年

    用户输入一个年份,判断这个年是否是闰年.判断闰年条件:① 非整百年数除以4,无余为闰,有余不闰:② 整百年数除以400,无余为闰,有余不闰.比如:2000年,整百数年,就要用②公式,除以400,无余数 ...