前言
隨着移動互聯網的蓬勃發展,手機App層出不窮,其業務也隨之變得錯綜復雜。針對於開發人員來說,可能之前的一個業務只需要調取一次第三方接口以獲取數據,而如今隨着需求的增加,該業務需調取多個不同的第三方接口。通常,我們處理方法是讓代碼同步順序的去調取這些接口。顯然,調取接口數量的增加必然會造成響應時間的增加,勢必會對系統性能造成一定影響。
為了保證系統響應迅速,需要尋找一種方法能夠使調取接口能夠異步執行,而java正好提供了類似的方法,在java.util.concurrent中包含了Future相關的類,運用其中的一些類可以進行異步計算,以減少主線程的等待時間。比如啟動一個main方法,main中又包含了若干個其它任務,在不使用java future的情況下,main方法中的任務會同步阻塞執行,一個執行完成后,才能去執行另一個;如果使用java future,則main方法中的任務會異步執行,main方法不用等待一個任務的執行完成,只需往下執行就行。一個任務的執行結果又該怎么獲取呢?這里就需要用到Future接口中的isDone()方法來判斷任務是否執行完,如果完成完成則可獲取結果,如果沒有完成則需要等待,可見雖然主線程中的多個任務是異步執行,但是無法確定任務什么時候執行完成,只能通過不斷去監聽以獲取結果,所以這里是阻塞的。這樣,可能某一個任務執行時間很長會拖累整個主任務的執行。
針對這樣的情況,google對java.util.concurrent中的許多類進行封裝,最終產生了google guava框架,其中com.google.common.util中的ListenableFuture就是本文要敘述的重點。查看com.google.common.util,發現其中的很多類都是對java.util.concurrent的封裝,以增加特有的方法。ListenableFuture擴展了future方法,增加了addListener方法,該方法可以監聽線程,並通過回調函數來獲取結果,達到線程之間異步非阻塞執行。(future.get()異步阻塞?)
首先,了解下同步、異步、阻塞、非阻塞相關概念;其次,簡單介紹java future和guava future相關技術,並通過示例代碼進一步對其進行理解;最后,對java future和guava future進行比較。
同步、異步、阻塞、非阻塞
同步:所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。
異步:異步的概念和同步相對。當一個異步過程調用發出后,調用者不能立刻得到結果。實際處理這個調用的部件在完成后,通過狀態、通知和回調來通知調用者。
阻塞:阻塞調用是指調用結果返回之前,當前線程會被掛起(線程進入非可執行狀態,在這個狀態下,cpu不會給線程分配時間片,即線程暫停運行)。函數只有在得到結果之后才會返回。
非阻塞:非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。
https://blog.csdn.net/pistolove/article/details/51232004