gpt4 book ai didi

java - 使用ExecutorCompletionService对不同依赖项执行并发调用

转载 作者:太空宇宙 更新时间:2023-11-04 10:35:36 24 4
gpt4 key购买 nike

我正在尝试使用 ExecutorCompletionService - https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorCompletionService.html ,尝试对两个不同的依赖包执行并发调用。

我使用 ExecutorCompletionService 的原因是因为我想比较两个依赖项返回的结果,然后根据特定要求发出指标。

我的代码如下所示:

@Builder
@Slf4j
public class TestClass {

@NonNull private final ExecutorService threadPool = Executors.newFixedThreadPool(2);
@NonNull private final ExecutorCompletionService<ResultStructure1> dependency1Thread = new ExecutorCompletionService<>(threadPool);
@NonNull private final ExecutorCompletionService<ResultStructure2> dependency2Thread = new ExecutorCompletionService<>(threadPool);

public void myMethod() {

RequestObject1 firstDependencyRequest = RequestObject1.builder()
.attribute1("someValue")
.attribute2("secondValue");

RequestObject2 secondDepdencyRequest = RequestObject1.builder()
.attribute1("depdency2Value")
.attribute2("depdency2Secondvalue");

dependency1Thread.submit(() -> dependency1Client1.call(firstDependencyRequest));
dependency2Thread.submit(() -> dependencyClient2.call(secondDepdencyRequest));

final Future<ResultStructure1> future1 = dependency1Thread.take();
final Future<ResultStructure2> future2 = dependency2Thread.take();
try {
ResultStructure1 = future1.get();
ResultStructure2 = future2.get();
} catch (ExecutionException e) {
log.error("Exception calling dependency", e);
throw e;
}
}
}

这是针对不同依赖项使用 ExecutorCompletionService 的正确方法吗?有没有办法拥有一个 executorService 并从中调用两个依赖项?

最佳答案

Is this the correct way to be using ExecutorCompletionService for different dependencies?

不幸的是,没有。您通常会使用它来执行返回类似类型结果的任务,同时等待它们的执行和结果可用。它在内部使用 BlockingQueue,在任务完成时添加 Future,然后由其阻塞 take 方法返回。

因此,如果您确实想使用 ExecutorCompletionService,则必须为 ResultStructure1ResultStructure2 提供一个基本/通用类型(即 ResultStructure),并声明一个完成服务,如下所示 -

private final ExecutorCompletionService<ResultStructure> completionService = 
new ExecutorCompletionService<>(threadPool)

然后 -

completionService.submit(() -> dependency1Client1.call(firstDependencyRequest));
completionService.submit(() -> dependencyClient2.call(secondDepdencyRequest));

然后,您可以使用阻塞 take 方法等待他们的结果可用 -

Future<ResultStructure> result1 = completionService.take();
Future<ResultStructure> result2 = completionService.take();

请注意,此时我们无法确定哪个 Future 代表哪种具体结果类型。所以你无法比较结果。

我的建议是直接使用 ExecutorService。

关于java - 使用ExecutorCompletionService对不同依赖项执行并发调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49521739/

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