gpt4 book ai didi

java - 如何在不询问 Futures 值的情况下让 ExecutorService 或 CompletionService 完成?

转载 作者:行者123 更新时间:2023-12-01 11:21:59 27 4
gpt4 key购买 nike

我们需要在一个线程中完成一些工作,该线程将在使用 Spring Boot 的 Web 应用程序的服务器上运行。

我们想要发生的是:1) 工作作为我们自定义的 Runnable 对象提交2)轮到工作时就完成了(这是一个数据库操作,我们不需要任何返回值,除了如果 run() 没有异常完成时可能返回“成功”)

但是,在我们的 JUnit 测试中,当主线程完成时,提交给 ExecutorService 或 CompletionService 的所有任务似乎都会消失,除非我们每次添加新任务时都调用 take() (因为它会阻塞,直到任务完成为止)。完成后,这会使任务按顺序运行,这违背了目的)或者如果我们维护一个 future 列表并调用一个方法来循环列表并 get() 每个特征的值。

我们认为后一个选项并不理想,因为作为服务器应用程序,我们会不断收到来自不同用户的请求,并且不知道如何检测何时应该清除 future 列表。

为什么线程会默默消失,有什么办法解决这个问题?

最佳答案

不要异步运行代码:只需直接测试Runnable:

@Test
public void test() {
Runnable r = <your runnable>;
r.run();
// various assertions
}

测试您选择的 ExecutorService 是否完成其工作是毫无意义的 - 您可以假设这一点。

如果您想断言您的应用程序行为正确,请使用功能测试;即,使用高超音速数据源启动一个容器(例如使用@SpringJUnit4ClassRunner),点击Spring Boot端点,然后断言对数据库的影响。

如果您的服务使用 Spring Boot 的 @Async 注解,您甚至可以提供使用 SynchronousTaskExecutor 的配置,这样您就不必在测试中暂停在做出断言之前。

关于java - 如何在不询问 Futures 值的情况下让 ExecutorService 或 CompletionService 完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31118446/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com