gpt4 book ai didi

java - Java Spring 中受控的 ThreadPoolExecutor

转载 作者:行者123 更新时间:2023-12-03 12:59:24 25 4
gpt4 key购买 nike

我需要在我的 Spring 应用程序中创建一个全局 ThreadPoolTask​​Executor,它将负责在我的应用程序中运行多线程任务。

但是,对于每个请求,我都想限制从该全局线程池中使用的线程数。我应该如何确保根据请求执行此限制?

例如。

我创建了一个全局线程池,最大池大小为 50 个线程。但我想将每个请求的线程数限制为 5 个线程。但是这5个线程只能从Configuration文件定义的全局线程池中可用的50个线程中分配。

创建任务执行器的配置类。

@Configuration
public class ThreadPoolConfiguration {

@Value("${threadpool.corepoolsize}")
int corePoolSize;

@Value("${threadpool.maxpoolsize}")
int maxPoolSize;

@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setCorePoolSize(corePoolSize);
pool.setMaxPoolSize(maxPoolSize);
pool.setWaitForTasksToCompleteOnShutdown(true);
return pool;
}
}

Controller 类

@RestController
public class WebController {

@Autowired
ThreadPoolTaskExecutor threadPool;

@RequestMapping("/process")
public String process(){

String msg = "";
List<Future<String>> futureList = new ArrayList<>();
for(int threadNumber = 0; threadNumber < 5; threadNumber ++){
CallableWorker callableTask = new CallableWorker(String.valueOf(threadNumber));
Future<String> result = threadPool.submit(callableTask);
futureList.add(result);
}

for(Future<String> future: futureList){
try {
msg += future.get() + "#####";
} catch (Exception e){}
}

return msg;
}
}

免责声明:这只是我从 blog post 获得的示例代码.

如何实现这样的设计?我没有看到任何可以创建的子线程池。我也不想为每个请求实例化一个线程池,因为那将是灾难性的。

有什么建议吗?

最佳答案

解决此问题的一种方法是创建可调用方法来处理元素列表而不是单个元素。

例如,如果您想要删除请求中的 x 个项目,您可以创建 x/5 个元素的列表并将此列表传递给您的可调用函数。这样,通过代码,您可以确保每个请求最多只使用 5 个线程。不过,您必须小心处理异常情况。 (例如,您可以将 elementID 的 Map 返回到结果枚举,其中结果可能是成功、可重试异常或不可重试异常。)

此方法可能因您要实现的目标而异。

关于java - Java Spring 中受控的 ThreadPoolExecutor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46041314/

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