加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – CompletableFuture:异步调用void函数

发布时间:2020-12-15 01:09:03 所属栏目:Java 来源:网络整理
导读:我试图在某些数据库异常上使用重试策略实现数据库查询.重试策略的代码不是很相关,所以我没有包含它.正如您在下面的代码中看到的那样 我编写了一个retryCallable,它采用重试策略和populateData()中的Callable. 在getDataFromDB中,我从DB获取数据并将数据放在

我试图在某些数据库异常上使用重试策略实现数据库查询.重试策略的代码不是很相关,所以我没有包含它.正如您在下面的代码中看到的那样 – 我编写了一个retryCallable,它采用重试策略和populateData()中的Callable.

在getDataFromDB中,我从DB获取数据并将数据放在全局散列图中,该散列图充当应用程序级别的缓存.

此代码按预期工作.我想从另一个类调用populateData.但是,这将是一个阻止呼叫.由于这是数据库并且具有重试策略,因此这可能很慢.我想异步调用populateData.

我如何使用CompletableFuture或FutureTask来实现这一目标?
CompletableFuture.runAsync期望可运行. CompletableFuture.supplyAsync期望供应商.我以前没有实现过这些东西.所以关于最佳实践的任何建议都会有所帮助.

Class TestCallableRetry {

public void populateData() {
        final Callable
最佳答案
如果将populateData方法拆分为两个部分,一个是获取数据的供应商,另一个是存储它的消费者,则可以很容易地将它们与CompletableFuture链接起来.

// Signature compatible with Supplier

然后,在populateData()中:

private ExecutorService executor = Executors.newCachedThreadPool();

public void populateData() {
    CompletableFuture
        .supplyAsync(this::fetchDataWithRetry,executor)
        .thenAccept(this::storeData);
}

使用Executor的supplyAsync版本是可选的.如果您使用单个arg版本,您的任务将在公共池中运行;适用于短期运行任务,但不适用于阻止的任务.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读