在并发编程中,我们通常会用到一组非阻塞的模型:promise,future 和 callback。其中的 future 表示一个可能还没有实际完成的异步任务的结果,针对这个结果可以添加 callback 以便在任务执行成功或失败后做出对应的操作,而 promise 交由任务执行者,任务执行者通过 promise 可以标记任务完成或者失败。 可以说这一套模型是很多异步非阻塞架构的基础。
参考 scala 和 netty 的代码重新定义了接口和实现,先介绍下和 netty 版本的区别:
去除了对 eventloop 的依赖,callback 的执行策略不同:任务未完成时添加的 callback,会在结束任务的线程执行;任务完成后添加的 callback 会在添加 callback 线程立即执行
一个 callback 执行后会立即被清理
callback 可以根据任务结果添加,支持添加以下三种 callback: oncomplete, onsuccess, onfailure, 不需要和 netty 的 futurelistener 一样大部分场景下都需要检查 future.issuccess 等
支持 callback 的组合,callback 包含一些函数式的方法,比如 compose 和 andthen 可以用来组合
使用 countdownlatch 替换掉了 netty 的 wait/notify 实现
去掉 netty future 一些不常使用的方法,同时补充一些模型间关联的方法,比如 promise.getfuture
然后再介绍几个使用这个 commons-future 的示例:
异步执行任务,获得 future 后添加 callback
异步执行任务,获得 future 后添加成功结束的 callback
异步执行任务,获得 future 后,添加失败结束的组合 callback
异步执行任务,获得 future 后阻塞等待任务完成
源文链接: http://isouth.org/archives/354.html
参考:
<a href="http://docs.scala-lang.org/sips/completed/futures-promises.html">http://docs.scala-lang.org/sips/completed/futures-promises.html</a>
<a href="http://scala-lang.org/">http://scala-lang.org/</a>
<a href="https://github.com/netty/netty">https://github.com/netty/netty</a>
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/countdownlatch.html">http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/countdownlatch.html</a>
<a href="http://biasedbit.com/countdownlatch-vs-wait-notify/">http://biasedbit.com/countdownlatch-vs-wait-notify/</a>