天天看點

Java Future模式實作

Java Future模式簡介

Future模式是Java多線程常用的模式,而且JDK也内置對Future模式的支援,比如在java.util.concurrent包下的FutureTask類。其核心思想在于:送出請求後,可以立即傳回對象,但是這個對象實際上是個假對象,并不可立即使用,但是我們可以在幹點别的事情後,就可以使用這個假對象擷取結果了。這是為什麼呢?因為在傳回假對象的時候,偷偷的開啟了一個線程去請求真正的結果資料。那麼下面,我們來模拟實作下Future模式。

代碼實作與分析

<a href="http://s2.51cto.com/wyfs02/M00/8B/06/wKiom1hBiN2QQwJyAABNwUkohec540.png" target="_blank"></a>

主流程是:用戶端類送出請求傳回,做一些其他工作後,在擷取請求的結果資料。

<a href="http://s5.51cto.com/wyfs02/M02/8B/03/wKioL1hBiSvTqru3AABB2oQ8_tI599.png" target="_blank"></a>

通過上圖,已經清晰的看到,在擷取資料時,立即傳回,同時開啟了一個線程。

<a href="http://s1.51cto.com/wyfs02/M00/8B/03/wKioL1hBiauQnAdEAABZpIHVeL4815.png" target="_blank"></a>

這裡需要特别注意的是使用到了wait/notify,那麼為什麼使用它們呢?

既然我們在請求後立即傳回了一個“假對象”,如果立即調用“假對象”的方法擷取結果資料,該怎麼辦呢?我們希望在偷偷開啟的線程任務結束後,“假對象”才可以調用方法傳回結果資料。是以,利用wait先阻塞住“假對象”的結果傳回,當線程完成了結果資料的請求後notify通知下“假對象”可以提供結果資料了。

<a href="http://s3.51cto.com/wyfs02/M01/8B/06/wKiom1hBi1iCZ4xVAABR4JPR7X0939.png" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M01/8B/03/wKioL1hBi33ht9oTAAAOkmcFWLg764.png" target="_blank"></a>

運作結果驗證:

<a href="http://s3.51cto.com/wyfs02/M00/8B/06/wKiom1hBi62zaD2EAAAn2fCy8DQ577.png" target="_blank"></a>

本文轉自zfz_linux_boy 51CTO部落格,原文連結:http://blog.51cto.com/zhangfengzhe/1879036,如需轉載請自行聯系原作者