下面是我的線程池ThreadPoolExecutor的規模和管理線程
<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(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;
}
你能提供堆棧跟蹤嗎?和'ceateTask'的代碼?我不相信這是'Executor'的問題。 – bradimus
IndexOutOfBoundException最可能是由您的代碼中的錯誤引起的,而不是由線程池的配置引起的。閱讀堆棧跟蹤,找到並修復它。 –
在java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1038) \t在java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1326) \t在java.util.concurrent中。 FutureTask $ Sync.innerGet(FutureTask.java:257) \t at java.util.concurrent.FutureTask.get(FutureTask.java:119) –