当前位置: 首页 > 知识库问答 >
问题:

在Vert.x中顺序减少Future

吴康平
2023-03-14

在我的项目中,我使用Java中Vert.x的Future实现。到目前为止一切都很顺利。然而,目前我有问题执行一个动作的对象列表顺序。问题在于reduce方法在Java中分别“reduce”和“sombining”结果。这将导致所有操作同时启动。实现顺序执行是可能的,可以在easy方法中看到这一点。

private Future<Void> action(String object) {
    System.out.println("started " + object);
    Future<Void> f = Future.future();
    vertx.setTimer(1000, res -> {
        System.out.println("doing " + object);
        f.complete();
    });
    return f;
}

private void easy() {
    action("one")
        .compose(ignore -> action("two"))
        .compose(ignore -> action("three"))
        .setHandler(ignore -> System.out.println("completed"));
}

private void list() {
    List<String> l = new ArrayList<>();
    l.add("one");
    l.add("two");
    l.add("three");

    Future<Void> f = Future.future();
    l.stream().reduce(f,
        (f1, s) -> action(s),
        (f1, f2) -> f2.compose(ignore -> f1)
    ).setHandler(res -> {
        System.out.println("completed");
    });
}

执行Easy时的输出:

started one
doing one
started two
doing two
started three
doing three
completed
started one
started two
started three
doing one
doing two
doing three
completed
function action(object) {
  return new Promise((resolve, reject) => {
    console.log("started " + object)
    window.setTimeout(() => {
      console.log("doing " + object);
      resolve()
    }, 1000);
  });
}

function easy() {
  action("one")
    .then(() => action("two"))
    .then(() => action("three"))
    .then(() => console.log("completed"));
}

function list() {
  l = ["one", "two", "three"]
  l.reduce((p, s) => p.then(() => action(s)), Promise.resolve())
    .then(() => console.log("completed"));
}

// easy()
list()

easylist的输出与Java代码的easy方法相同。我正在寻找的是一种修复Java中reduce方法的方法,或者一种实现相同结果的替代方法。

共有1个答案

林英武
2023-03-14

好啦。我在这里找到了一个foldLeft方法的实现,现在顺序执行工作正常...

private void list() {
    List<String> l = new ArrayList<>();
    l.add("one");
    l.add("two");
    l.add("three");

    Future<Void> f = Future.succeededFuture();

    foldLeft(l.iterator(), f,
        (f1, s) -> f1.compose(ignore -> action(s)))
        .setHandler(res -> {
            System.out.println("completed");
        });
}

private static <A, B> B foldLeft(Iterator<A> iterator, B identity, BiFunction<B, A, B> bf) {
    B result = identity;
    while(iterator.hasNext()) {
        A next = iterator.next();
        result = bf.apply(result, next);
    }
    return result;
}
 类似资料:
  • 问题内容: 有什么办法可以限制celery的工人数量?我的服务器很小,celery总是在1个核心处理器上创建10个进程。我想将此数目限制为3个进程。 问题答案: 我尝试在我的settings.py文件中将并发设置为1,将max_tasks_per_child设置为1,并同时运行3个任务。它仅以用户的身份生成1个进程,而以Celery的形式生成其他2个进程。它应该只运行1个进程,然后等待它完成,然后

  • 本文向大家介绍在C++中减少菜肴,包括了在C++中减少菜肴的使用技巧和注意事项,需要的朋友参考一下 假设有个厨师。并且他收集了有关他的n道菜的满意度的数据。厨师可以在1个单位时间内烹饪任何菜肴。菜的喜欢时间系数实际上是花费的时间 烹饪该菜肴(包括以前的菜肴)乘以其满意程度,即时间[i] *满意度[i]。 我们必须找到厨师在准备菜后可以获得的最大喜欢时间系数总和。可以以任何顺序准备菜肴,厨师可以丢弃

  • 问题内容: 在JSF中减小viewstate隐藏字段大小的最佳方法是什么?我已经注意到,我的视图状态大约为40k,这会下降到客户端,并在每次请求和响应(尤其是到达服务器)时都返回到服务器,这对于用户来说是一个严重的问题。 我的环境JSF 1.2,MyFaces,Tomcat,战斧,RichFaces 问题答案: 您是否尝试过将状态保存设置为服务器?这应该仅将ID发送给客户端,并在服务器上保持完整状

  • 我试图减少一个双精度字符的数量。我如何减少这一点: 到 这是斯威夫特的吗?

  • 我的MySQL中有一个InnoDB表,它存储产品的当前库存,每当产品售出时(总是按单位,即总是-1),库存就必须更新,比如说: 现在,我正在使用Hibernate,因此我通过将currentStock属性的值设置为“currentValue -1”来更新对象ProductStock,如下所示: 现在,我正在使用事务来提交更改,但是我不确定当同时进行多次销售时Hibernate会做什么,并且我无法成