【发布时间】:2015-06-29 14:34:37
【问题描述】:
我们有一些工作要在一个线程中完成,该线程将在服务器上运行,用于使用 Spring Boot 的 Web 应用程序。
我们想要发生的是: 1) 工作作为我们的自定义 Runnable 对象提交 2) 轮到它时工作完成(这是一个数据库操作,我们不需要任何返回值,除非在 run() 无异常完成时可能返回“Success”)
然而,在我们的 JUnit 测试中,似乎所有提交给 ExecutorService 或 CompletionService 的任务都会在主线程完成后消失,除非我们每次添加新任务时都调用 take()(因为它会阻塞直到任务完成完成,这使得任务按顺序运行,这违背了目的)或者如果我们维护一个期货列表并调用一个方法来遍历列表并获取()每个特征的值。
我们认为后一种选择并不理想,因为作为服务器应用程序,我们将不断收到来自不同用户的请求,并且不知道如何检测何时应该清除期货列表。
为什么线程会默默消失,有什么方法可以解决这个问题?
【问题讨论】:
-
这就是 JUnit 测试的默认运行程序的工作方式。它在执行完
@Test方法后终止JVM。 -
您可以拨打 awaitTermination stackoverflow.com/questions/1250643/…
-
哦,我明白了——所以在 JUnit 之外,线程将完成(假设没有例外),而不需要期货。有趣,谢谢!
标签: java concurrency executorservice