【问题标题】:for a list how to create future task one at a time有关如何一次创建一个未来任务的列表
【发布时间】:2017-09-22 05:12:33
【问题描述】:

我在java中给出了列表

List<String> list;

我有一个函数,它接受 String 并给出 CompletionStage。我想遍历列表并按顺序处理每个任务,即当一个任务给出结果时,只有我想从列表中安排下一个任务。有没有办法在不调用 .get() 的情况下异步执行此操作

我还希望能够在中途停下来,这取决于之前任务的结果。

【问题讨论】:

  • 如果您将等待当前任务的结果,为什么不实现它单线程而不是期货?
  • 节省资源?否则线程将被阻塞。
  • 既然你想按顺序运行任务,一个线程应该足够了。如果您想同时处理其他事情,您可以在一个单独的线程中运行所有任务并保持主线程运行。
  • 我不知道它在 java 内部是如何工作的。我以为我们可以调用一些http api,在等待响应时,甚至不会阻塞一个线程!顺便说一句,我也找到了解决方案。

标签: java completable-future futuretask


【解决方案1】:
// Starting off like this means the loop doesn't need to special case the first iteration
CompletionStage<Result> stage = CompletableFuture.completedFuture(null);
for (String str : list) {
    stage = stage.thenCompose(result -> shouldStop(result) ? result : yourFunction(str));
}

这样做的最终结果是stage 是一长串CompletionStage 对象链接在一起的最后一个。序列中的每个阶段仅在前一个阶段完成时才会执行,因为这就是thenCompose(以及所有CompletionStage 链接方法)的工作方式。每个阶段都会调用您的函数并将结果传递到下一个阶段 - 直到您获得想要停止的结果,此时shouldStop 检查将使所有剩余阶段仅传递该结果直到stage本身以该结果值完成。

【讨论】:

  • 是的,这正是我发现的和它的工作原理。
【解决方案2】:

您可以使用自定义的 for 循环进入您的列表,然后在 for 循环中,您可以做任何您想做的事情,例如 continue、break、...

这是一个如何在 java 中循环列表的示例:

List<String> list;//here assumed that you already initialized your list

for(String l: list) {//here each element of list is called l
//Do what ever you want to do here
System.out.println("single element of list: "+ l);
}

希望这是您正在寻找的。 更新我是否适用于修改

【讨论】:

    猜你喜欢
    • 2018-03-10
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多