在并發程式設計中,我們通常會用到一組非阻塞的模型: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>