首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

别再纠结线程池大小 + 线程数量了,没有固定公式的!

作者 | 空无 来源 | https://juejin.cn/post/6948034657321484318 线程数和CPU利用率的小测试 线程数和CPU利用率的小总结 线程数规划的公式 真实程序中的线程数...如果每个线程都很“霸道”,不停的执行指令,不给CPU空闲的时间,并且同时执行的线程数大于CPU的核心数,就会导致操作系统更频繁的执行切换线程执行 ,以确保每个线程都可以得到执行。...先说结论:没有固定答案,先设定预期,比如我期望的CPU利用率在多少,负载在多少,GC频率多少之类的指标后,再通过测试不断的调整到一个合理的线程数 比如一个普通的,SpringBoot 为基础的业务系统,...因为此时这台主机上,已经有很多运行中的线程了,Tomcat有自己的线程池,HikariCP也有自己的后台线程,JVM也有一些编译的线程,连G1都有自己的后台线程。...连接池数量有限,中间件压力过大无法支撑等) 不断的增加/减少线程数来测试,按最高的要求去测试,最终获得一个“满足要求”的线程数** 而且而且而且!

86030

别再纠结线程池大小线程数量了,没有固定公式的

如果每个线程都很“霸道”,不停的执行指令,不给CPU空闲的时间,并且同时执行的线程数大于CPU的核心数,就会导致操作系统更频繁的执行切换线程执行,以确保每个线程都可以得到执行。...真实程序中的线程数 那么在实际的程序中,或者说一些Java的业务系统中,线程数(线程池大小)规划多少合适呢?...先说结论:没有固定答案,先设定预期,比如我期望的CPU利用率在多少,负载在多少,GC频率多少之类的指标后,再通过测试不断的调整到一个合理的线程数 比如一个普通的,SpringBoot 为基础的业务系统,...因为此时这台主机上,已经有很多运行中的线程了,Tomcat有自己的线程池,HikariCP也有自己的后台线程,JVM也有一些编译的线程,连G1都有自己的后台线程。...连接池数量有限,中间件压力过大无法支撑等) 不断的增加/减少线程数来测试,按最高的要求去测试,最终获得一个“满足要求”的线程数** 而且而且而且!

75760
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    别再纠结线程池大小线程数量了,没有固定公式的

    如果每个线程都很“霸道”,不停的执行指令,不给CPU空闲的时间,并且同时执行的线程数大于CPU的核心数,就会导致操作系统更频繁的执行切换线程执行,以确保每个线程都可以得到执行。...真实程序中的线程数 那么在实际的程序中,或者说一些Java的业务系统中,线程数(线程池大小)规划多少合适呢?...先说结论:没有固定答案,先设定预期,比如我期望的CPU利用率在多少,负载在多少,GC频率多少之类的指标后,再通过测试不断的调整到一个合理的线程数 比如一个普通的,SpringBoot 为基础的业务系统,...因为此时这台主机上,已经有很多运行中的线程了,Tomcat有自己的线程池,HikariCP也有自己的后台线程,JVM也有一些编译的线程,连G1都有自己的后台线程。...连接池数量有限,中间件压力过大无法支撑等) 不断的增加/减少线程数来测试,按最高的要求去测试,最终获得一个“满足要求”的线程数** 而且而且而且!

    1.2K40

    别再纠结线程池大小线程数量了,没有固定公式的

    如果每个线程都很“霸道”,不停的执行指令,不给CPU空闲的时间,并且同时执行的线程数大于CPU的核心数,就会导致操作系统更频繁的执行切换线程执行,以确保每个线程都可以得到执行。...真实程序中的线程数 那么在实际的程序中,或者说一些Java的业务系统中,线程数(线程池大小)规划多少合适呢?...先说结论:没有固定答案,先设定预期,比如我期望的CPU利用率在多少,负载在多少,GC频率多少之类的指标后,再通过测试不断的调整到一个合理的线程数 比如一个普通的,SpringBoot 为基础的业务系统,...因为此时这台主机上,已经有很多运行中的线程了,Tomcat有自己的线程池,HikariCP也有自己的后台线程,JVM也有一些编译的线程,连G1都有自己的后台线程。...连接池数量有限,中间件压力过大无法支撑等) 不断的增加/减少线程数来测试,按最高的要求去测试,最终获得一个“满足要求”的线程数** 而且而且而且!

    1.4K30

    五种线程池的对比与使用

    (最小线程数),最大线程数量,保持时间,时间单位,阻塞队列这些参数,最大线程数设置为jvm可用的cpu数量为最佳实践 newWorkStealingPool 获取当前可用的线程数量进行创建作为并行级别...new LinkedBlockingQueue())); } newFixedThreadPool 创建重用固定数量线程的线程池...,然后传入线程数量 下面来介绍一下ScheduledThreadPoolExecutor public ScheduledThreadPoolExecutor(int corePoolSize) {...submit(),提交一个线程任务,可以接受回调函数的返回值吗,适用于需要处理返回着或者异常的业务场景 execute(),执行一个任务,没有返回值 shutdown(),表示不再接受新任务,但不会强行终止已经提交或者正在执行中的任务...newFixedThreadPool:创建一个固定大小的线程池,因为采用无界的阻塞队列,所以实际线程数量永远不会变化,适用于可以预测线程数量的业务中,或者服务器负载较重,对当前线程数量进行限制。

    1K20

    java 线程池

    java 中提供了3种实现 ThreadPoolExecutor:标准线程池 ScheduledThreadPoolExecutor:支持延迟任务的线程池 ForkJoinPool:类似于ThreadPoolExecutor...handler:线程池中的数量大于maximumPoolSize,对拒绝任务的处理策略,默认值ThreadPoolExecutor.AbortPolicy()。...只执行一次,没有周期性。 scheduleAtFixedRate(commod,initialDelay,period,unit),固定速率执行周期任务。...这个是以delay为固定延迟时间,按照一定的等待时间来执行任务,initialDelay意义与上面的相同。 3....它使用了一个无限队列来保存需要执行的任务,而线程的数量则是通过构造函数传入,如果没有向构造函数中传入希望的线程数量,那么当前计算机可用的CPU数量会被设置为线程数量作为默认值。

    97430

    狗哥肝了一下午的线程池,奉上~

    什么是线程池? 线程池是一种池化技术,简单来说就是一个管理线程的池子。这个池子里面的线程数是固定的,当任务数量大于线程数量时,会对线程进行复用。...为什么使用线程池? 那为什么要使用线程池呢?手动创建不香吗?真的不香,手动创建的情景仅仅适合很少任务量的情况。比如:只有一个任务,这问题不大。...但我的任务确实多,咋办?这个时候线程池就出现了,它的出现解决了以上两点问题。 首先,针对反复创建线程开销大的问题,线程池用固定数量的线程保持工作状态并复用。...即使任务数 > 核心线程数,也不会再创建线程,而是扔到队列等待。 队列也满了,那就走拒绝策略。 线程闲置,马上回收。 线程数量固定,比较适用于耗时较长的任务。避免频繁回收和分配线程。...队列是 SynchronousQueue 容量是 0,不存储任务,只做中转。 适用于耗时较短的任务、任务处理速度 > 任务提交速度。就不会造成不断创建新线程。

    36610

    理解Java并发工具包线程池的设计

    为什么需要线程池? 答:主要原因是因为创建一个线程开销太大,尤其是对大量的小任务需要执行这种场景。...) 参数比较多,所以在Executors类里面通过静态工厂方法,已经给我们涉及好了几种实现,我们可以 直接使用,下面我们详细看下最常见的几种线程池,如下: (1)固定数量的线程池 拥有固定数量的线程来处理任务...=maximumPoolSize,//核心数量=最大线程池数量=固定数量 keepAliveTime=0//永远不销毁线程,等于0的情况,核心线程在不使用的时候不能被销毁 unit=TimeUnit.MILLISECONDS...(4)延迟指定时间后执行一次任务或者周期执行任务的只拥有单个线程的线程池 这个线程池其实是ThreadPoolExecutor的子类ScheduledThreadPoolExecutor提供的功能:...=new AbortPolicy() //队列满了,直接抛出异常 (5)延迟指定时间后执行一次任务或者周期执行任务的只拥有执行线程的线程池 这个线程池其实是ThreadPoolExecutor的子类ScheduledThreadPoolExecutor

    72620

    线程池实现原理

    细说参数:核心线程数(Core Pool Size):核心线程数是线程池中一直保持活动的线程数量,即使它们处于空闲状态。线程池会根据工作队列的任务数量自动调整活动线程的数量,但不会低于核心线程数。...该方法只接受Runnable类型的任务,即没有返回值的任务。submit: submit方法是ExecutorService接口中定义的方法,它用于提交既可以有返回结果也可以没有返回结果的任务。...调用shutdown()方法后,线程池会拒绝接受新的任务提交,但会继续执行已经提交的任务和队列中的任务。...只包含一个线程的 ScheduledThreadPoolExecutor。ScheduledFutureTask 主要包含 3 个成员变量,如下。...综上所述,IO 密集型任务的合适线程数量没有固定的标准,需要根据具体情况进行评估和调优。在实际应用中,可以进行性能测试和监测,找到最佳的线程数量来提高系统性能。

    7410

    Executor执行器与线程池

    ; SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。...(finalize() 方法在执行过程中也会调用shutdown()方法进入该状态); STOP:不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。...:线程池曾经创建过的最大线程数量。...通过这个数据可以知道线程池是否满过,也就是达到了maximumPoolSize; getPoolSize:线程池当前的线程数量; getActiveCount:当前线程池中正在执行任务的线程数量。...是支持周期性任务的调度的线程池执行器,与Timer相比更加强大; ScheduledThreadPoolExecutor实现ScheduledExecutorService接口; ScheduledThreadPoolExecutor

    94030

    java并发编程的艺术第十章——Executor框架

    FixThreadPool:创建固定线程数的线程池,构造函数中可以指定线程数量,适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场景,它适用于负载比较重的服务器。...与FixThreadPool类似,只是SingleThreadExecutor的线程数固定为1 CachedThreadPool:可以根据需要创建新的线程,CachedThreadPool是大小无界的线程池...只包含一个线程的SchduledThreadPoolExecutor。...SingleThreadExecutor:与FixThreadPool类似,只是SingleThreadExecutor的线程数固定为1 CachedThreadPool:CachedThreadPool...3、ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor主要用来执行需要延迟或者定时执行的任务,功能与Timer类似,不同的是Timer只能单线程允许

    56220

    Java多线程面试准备:聊聊Executor框架

    可以将此种模式分为两层,在上层,Java多线程程序通常把应用程序分解为若干任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上...以下是这三种线程池的应用场景说明: FixedThreadPool适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场 景,它适用于负载比较重的服务器。...CachedThreadPool是大小无界的线程池,适用于执行很多的短期异步任务的小程序,或者 是负载较轻的服务器 4、ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor...ScheduledThreadPoolExecutor:包含若干个线程的ScheduledThreadPoolExecutor。...SingleThreadScheduledExecutor:只包含一个线程的ScheduledThreadPoolExecutor。

    1.2K50

    新手也能看懂的线程池学习总结

    没搞懂的话,也没关系,可以看看我的分析: 我们在代码中模拟了 10 个任务,我们配置的核心线程数为 5 、等待队列容量为 100 ,所以每次只可能存在 5 个任务同时执行,剩下的 5 个任务会被放到等待队列中去...线程池不再接受新任务了,但是队列里的任务得执行完毕。 shutdownNow() :关闭线程池,线程的状态变为 STOP。...5.1 FixedThreadPool 5.1.1 介绍 FixedThreadPool 被称为可重用固定线程数的线程池。...通过 Executors 类中的相关源代码来看一下相关实现: /** * 创建一个可重用固定数量线程的线程池 */ public static ExecutorService...ScheduledThreadPoolExecutor 可以配置任意数量的线程。

    40420

    新手也能看懂的线程池学习总结

    没搞懂的话,也没关系,可以看看我的分析: 我们在代码中模拟了 10 个任务,我们配置的核心线程数为 5 、等待队列容量为 100 ,所以每次只可能存在 5 个任务同时执行,剩下的 5 个任务会被放到等待队列中去...线程池不再接受新任务了,但是队列里的任务得执行完毕。 shutdownNow() :关闭线程池,线程的状态变为 STOP。...5.1 FixedThreadPool 5.1.1 介绍 FixedThreadPool 被称为可重用固定线程数的线程池。...通过 Executors 类中的相关源代码来看一下相关实现: /** * 创建一个可重用固定数量线程的线程池 */ public static ExecutorService...ScheduledThreadPoolExecutor 可以配置任意数量的线程。

    76110

    新手也能看懂的线程池学习总结

    没搞懂的话,也没关系,可以看看我的分析: 我们在代码中模拟了 10 个任务,我们配置的核心线程数为 5 、等待队列容量为 100 ,所以每次只可能存在 5 个任务同时执行,剩下的 5 个任务会被放到等待队列中去...线程池不再接受新任务了,但是队列里的任务得执行完毕。 shutdownNow() :关闭线程池,线程的状态变为 STOP。...5.1 FixedThreadPool 5.1.1 介绍 FixedThreadPool 被称为可重用固定线程数的线程池。...通过 Executors 类中的相关源代码来看一下相关实现: /** * 创建一个可重用固定数量线程的线程池 */ public static ExecutorService...ScheduledThreadPoolExecutor 可以配置任意数量的线程。

    55030

    死磕 java线程系列之线程池深入解析——定时任务执行流程

    注:本文基于ScheduledThreadPoolExecutor定时线程池类。 简介 前面我们一起学习了普通任务、未来任务的执行流程,今天我们再来学习一种新的任务——定时任务。...,无返回值; (2)未来执行一次的任务,有返回值; (3)未来按固定频率重复执行的任务; (4)未来按固定延时重复执行的任务; 本文主要以第三种为例进行源码解析。...scheduleAtFixedRate()方法 提交一个按固定频率执行的任务。 public ScheduledFuture<?...// 注意,这里没有传入firstTask参数,因为上面先把任务扔到队列中去了 // 另外,没用上maxPoolSize参数,所以最大线程数量在定时线程池中实际是没有用的 if...延时队列内部是使用“堆”这种数据结构来实现的,有兴趣的同学可以看看之前的《拜托,面试别再问我堆(排序)了!》。 我们这里只拿一个take()方法出来分析。

    68920

    Java并发——线程池(八)

    通过创建一定数量的线程,让这些线程处于就绪状态来提高系统响应速度,在线程使用完成后归还到线程池来达到重复利用的目标,从而降低系统资源的消耗。...参考: Java线程池实现原理及其在美团业务中的实践合理使用线程池以及线程变量为什么使用线程池如果没有线程池的时候,每发布一个任务就需要创建一个新的线程,带来问题有:反复创建线程系统开销比较大,每个线程创建和销毁都需要时间...2.3 线程池生命周期RUNNING:;SHUTDOWN:不再接受新任务,但要处理任务队列里的任务;STOP:不再接受新任务,不再处理任务队列里的任务,中断正在进行中的任务;TIDYING:表示线程池正在停止运作...④通过设置 corePoolSize 和 maximumPoolSize 为相同的值,就可以创建固定大小的线程池。...也就是说该线程池的线程数量不是固定不变的,当然它也有一个用于存储提交任务的队列,但这个队列是 SynchronousQueue,队列的容量为0,实际不存储任何任务,它只负责对任务进行中转和传递,所以效率比较高

    12200

    并发编程之线程池ThreadPoolExecutor

    单个线程的话还好,如果线程的并发数量上来之后,就会频繁的创建和销毁对象。这样,势必会消耗大量的系统资源,进而影响执行效率。 所以,线程池就应运而生。...总结一下线程池的执行过程。 当线程数量未达到corePoolSize的时候,就会创建新的线程来执行任务。 当核心线程数已满,就会把任务放到阻塞队列。...注意,此时不再接受新提交的任务,但是,会继续处理正在运行的任务和阻塞队列里边的任务。 shutdownNow也会关闭线程池。但是,它不再接受新任务,并且会尝试终止正在运行的任务。...都有两种创建方式,其中一种可以传自定义的线程工厂。此处,只贴出不带工厂的方法便于理解。 ?...TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); } 创建一个固定大小的线程池

    45920
    领券