java - 如何创建使用缓存值的 CompletableFuture?

标签 java completable-future

我熟悉使用Guava的Suppliers.memoizeWithExpiration()CacheBuilder缓存延迟加载值。

我很难弄清楚如何对异步加载的值执行相同的操作(使用 CompletableFuture )。

具体来说,我想要一个返回 CompletableFuture 的机制如果可用的话,将返回一个缓存值;否则,计算并缓存该值。

恐怕如果我使用 Supplier<CompletableFuture<Integer>> cache = Suppliers.memoize()那么供应商将缓存CompletableFuture但消费者每次都会重新运行管道。

我有什么选择?

最佳答案

快速测试消除了我的恐惧:

public final class Testcase
{
    public static void main(String[] args) throws InterruptedException, ExecutionException
    {
        Random random = new Random();
        Supplier<CompletableFuture<Integer>> cache = Suppliers.memoize(() ->
        {
            return CompletableFuture.supplyAsync(() ->
            {
                return random.nextInt();
            });
        });
        for (int i = 0; i < 10; ++i)
            System.out.println(cache.get().get());
    }
}

输出:

1171697378
1171697378
1171697378
1171697378
1171697378
1171697378
1171697378
1171697378
1171697378
1171697378

现在想想,我意识到 Supplier 每次都会返回相同的 CompletableFuture 实例,并且一旦 CompletableFuture 完成,它就会保证每次都返回相同的值。所以我们很安全。

关于java - 如何创建使用缓存值的 CompletableFuture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49099554/

相关文章:

java - 谷歌CP : Unable to try Cloud Billing Account API from Java

java - stackoverflow 如何影响 mule 中的池化组件?

java - 如何创建异步堆栈跟踪?

java - 使用带有 CompletableFuture 的默认公共(public) fork/join 池进行长阻塞调用是不好的做法吗?

Java CompletableFutures : is it ever a acceptable to not join/get?

java - 有什么工具可以帮助用户设计要由我的应用程序使用的状态机?

java - 获取以下内容以返回文本文件中具有特定格式的所有 url

java - 本地 GAE java 开发服务器的 Google Pub/Sub 测试策略

java - CompletableFuture 的多个 thenAccept block 的执行顺序是什么

java - 如何中断 CompletableFuture::join?