java线程池大小多少才合适?java线程池有哪些?

我们知道,线程池过大这不仅会导致更高的内存使用量,而且还可能耗尽资源。线程池过小,将导致许多空闲的处理器无法执行工作,从而降低吞吐率。那java线程池大小多少才合适?下面来我们就来给大家讲解一下。

java线程池大小多少才合适.jpg

设置线程池的大小,必须分析计算环境、资源预算、任务的特性。在部署的系统中有多少个 CPU? 多大的内存? 任务是计算密集型、I/O密集型还是二者皆有?

计算密集型线程池大小设置参考:在 N 个处理器的系统上,当线程池的大小为 N+1 时,通常能实现最优的利用率。(即使当计算密集型的线程偶尔由于页缺失故障或者其他原因而暂停时,这个“额外”的线程也能确保CPU的时钟周期不会被浪费。)

I/O密集型线程池大小设置参考:N(thread) = N(cpu)*(1+W/C) ,W:I/O 资源获取等待时间;C:除 I/O 资源获取外的计算时间。

当任务需要某种资源池来管理的资源时,例如数据库连接,那么线程池和资源池的大小将会相互影响,如果每个任务都需要一个数据库连接,那么连接池的大小就限制了线程池的大小。同样,当线程池中的任务是数据库连接的唯一使用者时,那么线程池的大小又将限制连接池的大小。

还需要考虑容器运行环境配置:tomcat 容器运行在 JVM 上,JVM 运行在 OS 上,JVM 的线程和OS 的线程一一对应。

java线程池有哪些?

1、newCachedThreadPool,是一种线程数量不定的线程池,并且其最大线程数为Integer.MAX_VALUE,这个数是很大的,一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。但是线程池中的空闲线程都有超时限制,这个超时时长是60秒,超过60秒闲置线程就会被回收。调用execute将重用以前构造的线程(如果线程可用)。这类线程池比较适合执行大量的耗时较少的任务,当整个线程池都处于闲置状态时,线程池中的线程都会超时被停止。

2、newFixedThreadPool 创建一个指定工作线程数量的线程池,每当提交一个任务就创建一个工作线程,当线程 处于空闲状态时,它们并不会被回收,除非线程池被关闭了,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列(没有大小限制)中。由于newFixedThreadPool只有核心线程并且这些核心线程不会被回收,这样它更加快速底相应外界的请求。

3、newScheduledThreadPool 创建一个线程池,它的核心线程数量是固定的,而非核心线程数是没有限制的,并且当非核心线程闲置时会被立即回收,它可安排给定延迟后运行命令或者定期地执行。这类线程池主要用于执行定时任务和具有固定周期的重复任务。

4、newSingleThreadExecutor这类线程池内部只有一个核心线程,以无界队列方式来执行该线程,这使得这些任务之间不需要处理线程同步的问题,它确保所有的任务都在同一个线程中按顺序中执行,并且可以在任意给定的时间不会有多个线程是活动的。

其实我们在工作中一定要合理设置java线程池大小,过大或者过小都是不行的,只有合理的设置,才能让线程次发挥出它的作用哦!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。

推荐阅读:

java如何一步写四种加法算式?java怎么实现四则运算?

java培训课程有什么?java培训课程好学吗?

javaidea如何使用?javaidea使用教程之创建java