gpt4 book ai didi

java - ThreadPoolExecutor 大小和管理线程

转载 作者:行者123 更新时间:2023-11-30 07:13:05 26 4
gpt4 key购买 nike

下面是我在线程池上的配置

<bean id="executorServiceThreadPool"
class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean">
<property name="corePoolSize" value="100" />
<property name="maxPoolSize" value="500" />
<property name="keepAliveSeconds" value="60" />
<property name="WaitForTasksToCompleteOnShutdown" value="true" />
</bean>

我正在 for 循环中创建线程并一起执行它们。

for(int i=0;i<sublist.size();i++) {
Callable<Object> secDataTask = createTask(businessDate, sublist.get(i));
taskList.put(SecYieldConstants.SECURITY_SEC_TASK+i, secDataTask);
}
Map<Callable<Object>,Object> taskResult =
commonTaskExecutor.executeTasksConcurrently(MAX_TIMEOUT, taskList);

列表通常为 10-20K,并且对于列表中的每个项目,大约会创建 10 个任务。

当我使用默认设置执行它时,我要么得到 InterruptedException,要么得到 IndexOutOfBoundException。

但是,如果我创建一个只有 5-10 个的子列表,它就可以正常工作,

在这种情况下我的池大小应该是多少?或者有没有办法让 JVM 处理我的池大小

创建任务的代码:

private Callable<Object> createTask(final Date businessDate,final Object obj) {
Callable<Object> securitySecTask = new Callable<Object>() {
public Object call() throws Exception {
Object result = retrieveInnerResult(businessDate,obj)
return result;
}
};
return securitySecTask;
}


private Callable<Object> retrieveInnerResult(final Date businessDate,final Object obj) {
Callable<Object> securitySecTask = new Callable<Object>() {
public Object call() throws Exception {
Object result = retrievetask2Result(businessDate,obj)
return result;
}
};
return securitySecTask;
}

最佳答案

IndexOutOfBoundException 错误可能来自于在特定索引处(或代码中的其他位置!)向 taskList 添加元素,与线程池无关.

关于线程池,100个核心大小很大,500个最大值也很大!代码很可能在没有那么多核心的 CPU 上运行。因此,除非正在执行的代码严重阻塞(例如等待网络查询),否则拥有这么多线程可能会减慢整体执行速度。尝试减少线程数以查看程序的 react 。

关于InterruptedException,可能是您正在尝试关闭池,并且正在执行一些可以中断的任务并引发该异常。如果没有更多信息,很难说。

我希望这会有所帮助。

关于java - ThreadPoolExecutor 大小和管理线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38856820/

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