【发布时间】:2017-07-11 14:06:02
【问题描述】:
我想将 web 服务调用并行发送到 web 服务。最多应有 20 个并行请求等待 Web 服务响应。任何其他请求都应等待它们完成。
如果单个用户向我发送请求,这通常会导致向目标服务器发送 5 个并行请求。 所以我一次最多可以为 20/5 = 4 个用户提供服务。其他人将不得不等待,这很好。或者在非常高的负载下被拒绝。
问题:我应该使用哪个线程池,我应该如何配置它?
private ExecutorService asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(100);
executor.initialize();
//return executor.getThreadPoolExecutor(); //I could as well use this. Which is better??
return Executors.newFixedThreadPool(20, executor);
}
我阅读以上内容如下:主池可以向网络服务器发送 20 个并行请求(从而以并行方式立即为 4 个用户提供服务)。如果所有 20 个线程都忙并且第 5 个用户进来,则请求排队。
问题:
配置正确吗?
为什么我必须在
Executors.newFixedThreadPool()中额外设置nthreads=20?设置poolSize有什么区别?设置
corePoolSize=20是否存在性能开销?我的意思是,那么游泳池将永远不会减少。但我可能无法将它设置得更低(例如设置为 5),因为只有在队列耗尽时才会创建新线程。对吧?
【问题讨论】:
-
如果您更仔细地查看
ThreadPoolTaskExecutor,您会发现它是ThreadFactory和java.util.concurrent.ThreadPoolExecutor类的包装器。调用Executors.newFixedThreadPool接受ThreadFactory的实例,并创建另一个包装给定线程工厂的ThreadPoolExecutor。如果您只使用其中一个而不是像这样包装它,则不需要告诉您的配置数据两次。
标签: java spring multithreading web-services parallel-processing