gpt4 book ai didi

java - 分布式环境中的ExecutorCompletionService.take()方法

转载 作者:行者123 更新时间:2023-11-30 06:52:09 25 4
gpt4 key购买 nike

我正在尝试在具有多个主机并从多个客户端调用的 WebServer 中实现 ExecutorCompletionService

我的问题与 ExecutorCompletionService.take() 方法的实现有关。我的 ExecutorCompletionService 声明是一个单例,其池大小固定为 20 个线程,作为 spring 注入(inject) bean 的一部分。

现在假设这种情况:

  1. 从方法调用的实例 1 中:我向服务提交了 5 个任务来处理。

  2. 从方法调用的实例 2 开始:我从其他客户端并行向服务提交 6 个任务。

  3. 从实例 1 开始:我调用 executorCompletionService.take() 5 次。

当从同一个实例调用时,是否可以保证我会获得与实例 1 中提交的任务相对应的值?

请注意,我只是在结束时取消任务,并且我的固定线程池始终保持 Activity 状态。

最佳答案

我认为有关 ExecutorCompletionService 的文档中的这一行是关键:

The class is lightweight enough to be suitable for transient use when processing groups of tasks

换句话说,它足够轻量级,可以使其成为请求范围的对象,甚至作为局部变量或字段。

因此,您不应该真正将其设为单例,因为正如您所怀疑的那样,它不会区分从一个请求/线程或另一个请求/线程提交的任务。

相反,将 Executor 设置为单例,并为所有 ExecutorCompletionService 共享它。

更新

@Inject private Executor executor;  // can be singleton

public void someMethod() {
ExecutorCompletionService ecs1 = new ExecutorCompletionService(executor);
ExecutorCompletionService ecs2 = new ExecutorCompletionService(executor);

// ExecutorCompletionService should be scoped per instance

ecs1.submit(task1)
ecs1.submit(task2);
ecs1.submit(task3);

ecs2.submit(task4)
ecs2.submit(task5);
ecs2.submit(task6);

// ecs1 `take` will only return tasks submitted to ecs1
// ecs2 `take` will only return tasks submitted to ecs2

}

关于java - 分布式环境中的ExecutorCompletionService.take()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42534799/

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