【问题标题】:Java functions don't get executed in asyncJava 函数不会异步执行
【发布时间】:2021-07-25 00:51:41
【问题描述】:

我有问题。我有 4 个类:classAclassBclassC,所有的函数都称为run()。现在我正在尝试使用异步,所以我想要的是以下内容:

  1. 在我的MainClass 中,我从classA 调用了一个名为run() 的异步函数
  2. classA.run() 的末尾,我调用了classB.run()
  3. 在我的 MainClass 中,我想等到 classAclassB 打印完他们的行,然后再运行 classC.run()

这是每个班级的代码。 A类:

public class classA {

    public void run() {

        System.out.println("CLASS A");

        new classB().run();

    }
    
}

B类:

public class classB {
    
    public void run() {

        System.out.println("CLASS B");

    }

}

C类:

public class classC {

    public void run() {

        System.out.println("CLASS C");

    }
    
}

这是我MainClass的代码:

public class MainClass {

    public static void main(String[] args) {

        CompletableFuture<Void> testRun = CompletableFuture.runAsync(() -> {
            new classA().run();
        });

        CompletableFuture<Void> test2Run = CompletableFuture.completedFuture(testRun).thenRunAsync(() -> {
            new classC().run();
        });

    }

}

但在我的终端中我没有看到任何打印...

我做错了什么?

【问题讨论】:

  • 我添加了完整的代码,但并不多,因为我创建了一个快速测试项目。该程序的结果是在命令行中没有打印,但据我所知,异步执行的打印确实会打印?

标签: java


【解决方案1】:

您的代码有两个问题:

  1. 您无需等待任务完成。它们与您的 main() 方法异步运行,但它们可能无法在 main() 方法之前及时完成。这意味着您可能看不到任务的输出,这取决于它们是否足够快(请参阅“竞争条件”)。使用get()join() 等待完成。
  2. CompletableFuture.completedFuture() 不用于“等待”另一个任务完成。您正在构建两个并行运行的任务,这可能会产生类似"A, C, B" 的输出。如果您想“等待”完成,您可以使用 CompletableFuture.allOf()CompletableFuture.anyOf() 之类的东西,具体取决于您的需要。

【讨论】:

  • 是的!!!这成功了。只是一个与此有关的小问题。任务完成后我的主程序关闭,但是如果我在任务中打开 API 流怎么办......然后我希望程序永远不会完成,但继续运行?我应该在 google 上查找哪里?
  • @A.Vreeswijk 如果您希望您的应用程序防止终止,请创建一个非守护线程。查看其他问题,例如stackoverflow.com/questions/7416018/…
  • 谢谢,我去看看! :)
【解决方案2】:

testRuntestRun2ForkJoinPool.commonPool() 中的线程执行。
ForkJoinPool.commonPool() 中的线程在 main 线程终止时终止。

要等待异步操作完成,您应该调用awaitTermination

所以,main 方法应该是这样的:

public class MainClass {

    public static void main(String[] args) {
        CompletableFuture<Void> testRun = CompletableFuture.runAsync(() -> {
            new classA().run();
        });

        CompletableFuture<Void> test2Run = CompletableFuture.completedFuture(testRun).thenRunAsync(() -> {
            new classC().run();
        });

       ForkJoinPool.commonPool().awaitTermination(10, TimeUnit.SECONDS);
   }
}

编辑: 等待所有任务完成的更简洁的方法是:

CompletableFuture.allOf(testRun, test2Run).join();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多