【发布时间】:2021-08-08 22:31:02
【问题描述】:
抱歉,格式问题...
我已经尝试理解这一点大约 4 个小时了。基本上我有一个方法会调用一个使用 ThreadPoolTaskExecutor 的私有方法。
public ThreadPoolTaskExecutor someTaskExecutor() {
final ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(0);
taskExecutor.setMaxPoolSize(3);
taskExecutor.setKeepAliveSeconds(60);
taskExecutor.setQueueCapacity(3);
taskExecutor.afterPropertiesSet();
return taskExecutor;}
这就是我使用它的方式。不要介意“DTO”和“Obj”,只需将其设为占位符
@Override
public void processMessage(final DTO dto) throws Exception {
log.info("MainThread BEFORE [{}] : [{}] - [{}]", dto.getTaskId(), Thread.currentThread().getName(), Thread.currentThread().getId());
final Object obj = save(dto);
log.info("MainThread SAVED [{}] : [{}] - [{}]", dto.getTaskId(), Thread.currentThread().getName(), Thread.currentThread().getId());
generateSomething(obj);
log.info("MainThread AFTER [{}] : [{}] - [{}]", dto.getTaskId(), Thread.currentThread().getName(), Thread.currentThread().getId());
}
private void generateSomething(final Object obj) {
someTaskExecutor.execute(() -> {
log.info("thread START [{}] : [{}] - [{}]", obj.getTaskId(), Thread.currentThread().getName(), Thread.currentThread().getId());
//SOME API CALL THAT TAKES 3 second
log.info("thread DONE [{}] : [{}] - [{}]", obj.getTaskId(), Thread.currentThread().getName(), Thread.currentThread().getId());
});
以我的threadpooltaskexecutor的当前设置,当我对main方法有10个并发调用(产生10个主线程)时,只有6个线程成功通过调用私有方法后调用的“MainThread AFTER”有 threadpooltaskexecutor 执行。
目前我很迷茫,我的理解是主/调用线程不应该受到线程池任务执行器产生的新线程的影响,为什么它会直接受到队列容量的影响。如果我将队列容量设为 5 而不是 3,则 8 个主线程将正常通过。如果我不设置它,所有主线程都会正常通过。
感谢您的帮助,再次抱歉格式化。
【问题讨论】:
标签: java spring multithreading threadpool