我有一个Executor
线程池,核心大小和最大大小都保持在40,每个线程将使用来自Apache HTTP客户端的PoolingClientConnectionManager
的HTTP连接,每个主机路由有40个连接。我可以看到,如果负载较小,性能也会降低......你能帮帮我吗?
答案 0 :(得分:0)
使用以下内容:
ExecutorService service = Executors.newCachedThreadPool();
service.execute(someRunnable);
在这种情况下,您无需担心正在运行的线程数。 系统会自动为您上下调整线程数。
以下是文档:
public static ExecutorService newCachedThreadPool()
创建一个线程池,根据需要创建新线程,但是会 在先前构造的线程可用时重用它们。这些 池通常会提高执行程序的性能 许多短暂的异步任务。执行调用将重用 以前构造的线程(如果有)如果没有现有的线程 可用时,将创建一个新线程并将其添加到池中。主题 未使用60秒的任务将被终止并删除 从缓存。因此,一个长时间闲置的游泳池将会 不消耗任何资源。请注意具有相似属性的池 可以创建不同的细节(例如,超时参数) 使用ThreadPoolExecutor构造函数。
返回:新创建的线程池
希望它有所帮助。
答案 1 :(得分:0)
这完全取决于运行JVM的主机中有多少核心以及每个线程要使用多少CPU。
假设一个8核心主机 nothing else从JVM运行,你执行的每个任务都是纯粹的CPU绑定,那么你可能希望线程池大小为7(离开一个核心可用于JVM活动,如垃圾收集和其他操作系统任务。)
然而,系统永远不可预测,所以最好在预期的负载下进行一些分析,看看什么效果最好。