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

那么如何在未来的工作中完成呢?

茅炯
2023-03-14

主功能仅输出1、2和3。为什么run中的Runnable不能同时运行和打印4?

import java.util.concurrent.CompletableFuture;
import java.lang.Thread;

  class CF {
  static void doSomething() {
    try {
      Thread.sleep(100);
    } catch(InterruptedException e) {
      System.out.println("ggwp");
    }
  }
 
  static CompletableFuture<Void> printAsync(int i) {
    return CompletableFuture.runAsync(() -> {
      doSomething();
      System.out.print(i);
      System.out.println(Thread.currentThread().getName());
    });
  }
 
  public static void main(String[] args) {
    printAsync(1).join();
    CompletableFuture.allOf(printAsync(2), printAsync(3))
      .thenRun(() -> printAsync(4));
    doSomething();
    }
  }

但是,当我改变doWhat函数如下所示,所有的数字1,2,3和4将被打印。

  static void doSomething() {
    return;
  }

共有2个答案

夏华藏
2023-03-14

正如注释中提到的,. thenRun(()-

壤驷高洁
2023-03-14

printAsync()调用doSomething(),每次调用都会使调用线程Hibernate100毫秒。因此,您没有等待足够长的时间来查看4的输出。

您可以使用注释中建议的加入来等待所有提交的任务完成。或者(为了帮助理解正在发生的事情)您可以向doWhat添加一个参数来指定Hibernate的ms量,并在主线程中等待更长时间,如下所示。

这并不是说没有执行printAsync(4)。相反,jvm终止进程是因为所有非守护进程线程(在本例中是主线程)都在该点之前完成。

import java.util.concurrent.CompletableFuture;
import java.lang.Thread;

  class CF {
  static void doSomething(long sleep) {
    try {
      Thread.sleep(sleep);
    } catch(InterruptedException e) {
      System.out.println("ggwp");
    }
  }
 
  static CompletableFuture<Void> printAsync(int i) {
    return CompletableFuture.runAsync(() -> {
      doSomething(100);
      System.out.print(i);
      System.out.println(Thread.currentThread().getName());
    });
  }

  public static void main(String[] args) {
    printAsync(1).join();
    CompletableFuture.allOf(printAsync(2), printAsync(3))
      .thenRun(() -> printAsync(4));
    doSomething(500);
    }
  }
 类似资料:
  • 我是新的完全未来。我试图为元素列表(即参数)调用并行方法,然后将结果组合起来创建最终响应。我还试图设置50毫秒的超时,以便如果调用不返回50毫秒,我将返回默认值。 到目前为止,我已经尝试过: 但我一直得到错误说: 有人能告诉我我在这里做错了什么吗?如果我走错了方向,请纠正我。 谢谢

  • 我想要一个完整的未来,只发出完成的信号(例如,我没有返回值)。 我可以将CompletableFuture实例化为: 但是我应该向完整的方法提供什么呢?例如,我不能做

  • 是否有一种方法可以在不阻塞事件循环的情况下等待一个未来完成? 我知道这个错误通常意味着什么,但我不知道在这种情况下...我试图在谷歌上搜索它,但没有找到任何关于将哪份清单放在哪里的明确解释。和以前一样,除非是强制性的,我更喜欢一次学一件事。 那么,回到这个问题:“基本”Vert.x是否有一种方法可以在事件循环不受干扰的情况下等待未来?

  • 我目前正在开发我的第一个vert.x服务,我对我的部署是如何实现的并不十分有信心。 我有几个垂直点来接受来自其他服务的请求,并将大量工作委托给其他垂直点。我如何可以旋转每个任务的垂直线并在工作完成后将其杀死,或者通过编程方式将垂直线按任务数量放大。 我目前正在启动时生成十个顶点,并使用事件总线将这些任务分布在顶点上。

  • 我有几个单独的操作,我想以与JS中相同的风格链接这些操作。 所以目前我有这样的代码: 可以在一个链中重写吗?有点:

  • 问题内容: 我尽力而为,但没有找到任何文章和博客可以清楚地比较和,并且提供了很好的分析。 因此,如果任何人都可以向我解释或指向这样的博客或文章,那对我来说真的非常好。 问题答案: 无论 ListenableFuture 和 CompletableFuture 有超过它的父类的优势 未来 通过允许呼叫者在这样或那样的回调“注册”当异步动作已经完成被调用。 使用 Future, 您可以执行以下操作: