2014-10-19 98 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