按顺序运行异步操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按顺序运行异步操作相关的知识,希望对你有一定的参考价值。

我有一系列I / O操作(DB,I / O设备......)我需要按顺序运行。

@SafeVarargs
public final CompletableFuture<Boolean> execute(final Supplier<Boolean>... methods)
{
    CompletableFuture<Boolean> future = null;

    for (Supplier<Boolean> method : methods)
    {
        if (future == null)
        {
            future = CompletableFuture.supplyAsync(method, threadPool);
        }
        else
        {
            future.thenCombineAsync(CompletableFuture.supplyAsync(method, threadPool), (result, currentResult) -> result && currentResult,
                    threadPool);
        }
    }

    return future.exceptionally(this::onException);
}

我的代码随机执行。

  1. 我该怎么做才能确保订单?
  2. 我怎样才能将结果最终结合起来?例如,如果一切都是真的吗?
  3. 在一切都完成后应用回调来检查结果?
答案

您当前的解决方案立即调用supplyAsync(),然后尝试合并结果。

如果你想保证顺序执行,你应该使用thenApply()thenCompose()而不是thenCombine()

for (Supplier<Boolean> method : methods)
{
    if (future == null)
    {
        future = CompletableFuture.supplyAsync(method, threadPool);
    }
    else
    {
        future.thenApplyAsync(result -> result && method.get(), threadPool);
    }
}

请注意,如果任何一个供应商返回false,则不会在下一个供应商处调用method.get(),因为&&正在短路。您可以使用单个&来强制进行呼叫,或者交换参数。

这已经结合了所有布尔结果。您可以在循环后在结果future上添加任何内容,例如更多thenApply()调用,或阻止join()调用以检索Boolean

请注意,此循环也可以使用流重写:

future = Arrays.stream(methods)
        .reduce(CompletableFuture.completedFuture(true),
                (f, method) -> f.thenApplyAsync(result -> result && method.get()),
                (f1, f2) -> f1.thenCombine(f2, (result1, result2) -> result1 && result2));

以上是关于按顺序运行异步操作的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

csharp 在Swashbuckle Swagger中,此片段允许按字母顺序显示操作。

强制异步任务按顺序运行

代码如何在同步的单核CPU上异步?

html 将以编程方式附加外部脚本文件的javascript代码片段,并按顺序排列。用于响应式网站,其中ma

按顺序附加异步响应 swit 3