2014-10-19 96 views
0

番石榴的APIs爲AbstractLoadingCacheCacheLoader充滿單詞「線程安全」和「異步」。如何使用LoadingCache製作異步裝載器<K,V>?

不幸的是,我無法從API推導出如何創建異步延期加載程序。

例如,他們有一個樣品

CacheLoader<Key, Graph> loader = new CacheLoader<Key, Graph>() { 
    public Graph load(Key key) throws AnyException { 
     return createExpensiveGraph(key); 
    } 
    }; 
    LoadingCache<Key, Graph> cache = CacheBuilder.newBuilder().build(loader); 

現在我要檢查,如果一些關鍵值包含在緩存中,如果YES,然後繪製圖表。但是,如果否,然後繪製存根,啓動加載並繼續工作(GUI)。然後,當加載完成時,繪製圖形。

可能嗎?

+0

大概''CacheLoader'支持異步_reloading_ - 當已經計算出一個值時,你可以讓你的'Cache'繼續返回舊的結果,而新的結果是異步計算的。但加載初始值是同步完成的。 – 2014-10-19 18:22:07

回答

0

現在我想檢查一下,如果某個鍵的值包含在緩存中,並且如果是,則繪製圖形。但是,如果否,然後繪製存根,啓動加載並繼續工作(GUI)。

使用Cache#getIfPresent並且在它返回非null的情況下繪製它。

否則,繪製您的存根,開始Thread(或更好地提交任務給某個執行者),調用Cache#get。當它返回時,繪製真實的東西。

+0

我可以用'HashMap'來做到這一點。 'LoadingCache'然後做了什麼? – 2014-10-19 17:57:29

+0

@SuzanCioc顧名思義,它負責加載和緩存。無論何時需要,加載都會發生,無需您關心。但在這種情況下,你會在乎,因爲你不想等待它發生,這使得它不太有用。 +++緩存是一個比較複雜的部分,所有到期和容量選項都很難讓你自己完成。但是如果你不需要加載和緩存,那麼一張地圖就足夠了。 – maaartinus 2014-10-19 18:05:30

+0

如果您要使用線程,最好使用'ConcurrentHashMap',儘管... – 2014-10-19 22:11:53