智能建网站软件,汕头制作网站,注册公司名称查询系统官网,辽宁建设工程信息网怎么业绩加分线程池参数设置
hello丫#xff0c;各位小伙伴们#xff0c;好久不见了#xff01;
下面#xff0c;我们先来复习一下线程池的参数
1、线程池参数有哪些#xff1f; corePoolSize#xff08;核心线程数#xff09;#xff1a;线程池中的常驻核心线程数。即使这些线程…线程池参数设置
hello丫各位小伙伴们好久不见了
下面我们先来复习一下线程池的参数
1、线程池参数有哪些 corePoolSize核心线程数线程池中的常驻核心线程数。即使这些线程处于空闲状态它们也不会被销毁。除非设置了allowCoreThreadTimeOut否则核心线程在空闲时也不会被终止。 maximumPoolSize最大线程数线程池中允许的最大线程数。当工作队列已满并且正在执行的线程数等于corePoolSize时线程池会创建新的线程来处理任务直到线程数达到maximumPoolSize。 keepAliveTime线程空闲时间当线程数大于corePoolSize时这是多余空闲线程等待新任务的最长时间。超过这个时间后多余的空闲线程将被终止。这个参数帮助减少系统资源消耗。 unit时间单位keepAliveTime参数的时间单位例如SECONDS、MILLISECONDS等。 workQueue任务队列用于保存等待执行的任务的阻塞队列。当所有核心线程都在工作新提交的任务会被添加到这个队列中等待执行。队列的类型例如ArrayBlockingQueue、LinkedBlockingQueue或SynchronousQueue会影响线程池的行为。 threadFactory线程工厂用于创建新线程的工厂它提供了定制新线程的方式例如设置线程名、是否为守护线程等。 handler拒绝策略当线程池无法处理新任务时例如任务队列已满且线程数已达到maximumPoolSize这个策略定义了应该如何处理。Java提供了几种内置的拒绝策略如AbortPolicy抛出异常、CallerRunsPolicy调用者运行任务、DiscardOldestPolicy丢弃队列中最老的任务和DiscardPolicy直接丢弃任务。也可以根据需要实现自定义的拒绝策略。
2、线程池核心线程数和最大线程数怎么设置 分为CPU密集型和IO密集型 CPU这种任务消耗的主要是 CPU 资源可以将线程数设置为 NCPU 核心数1比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断或者其它原因导致的任务暂停而带来的影响。 IO密集型 这种任务应用起来系统会用大部分的时间来处理 I/O 交互而线程在处理 I/O 的时间段内不会占 用 CPU 来处理这时就可以将 CPU 交出给其它线程使用。因此在 I/O 密集型任务的应用中我们 可以多配置一些线程具体的计算方法可以是 核心线程数CPU核心数量*2。 最大线程数 一般设置为核心线程数的2~3倍这个数值是不固定的
实际工程经验可能并不是严格按照这个来的我们要根据实际开发场景来设置。
3、如何获取CPU核数 Runtime.getRuntime().availableProcessors(); 4、线程池工作流程原理 通俗易讲来说就是
内部是通过队列线程实现的当我们利用线程池执行任务时如果此时线程池中的线程数量小于corePoolSize(核心线程数)即使线程池中的线程都处于空闲状态也要创建新的线程来处理被添加的任务如果此时线程池中的线程数量等于corePoolSize但是阻塞队列(LinkedBlockingQueue)未满那么任务被放入阻塞队列。如果此时线程池中的线程数量大于等于corePoolSize缓冲队列workQueue满并且线程池中的数量小于maximumPoolize建新的线程来处理被添加的任务。如果此时线程池中的线程数量大于corePolSize缓冲队列workQueue满。并且线程池中的数量等于maximumPoolize那么通过 handler所指定的策略来处理此任务。当线程池中的线程数量大于corePoolSize时如果某线程空闲时间超过keepAliveTime线程将被终止。这样线程池可以动态的调整池中的线程数
5、那么再来复习一下线程池的4中拒绝策略 AbortPolicy。这是线程池的默认策略。当任务被拒绝时它会抛出RejectedExecutionException异常。这种方式直接告知任务被拒绝开发者可以根据业务逻辑决定是否重试或放弃提交新任务。DiscardPolicy。在这种策略下当新任务被提交时如果线程池无法处理将被直接丢弃不会有任何通知。这种策略适用于对任务执行不敏感的场景因为它可能会导致数据丢失。DiscardOldestPolicy。如果线程池未关闭且无法执行新任务则会丢弃任务队列中的最老任务即存活时间最长的任务然后可能尝试重新提交被拒绝的任务。这种策略旨在腾出空间给新提交的任务但同样存在数据丢失的风险。CallerRunsPolicy。当有新任务提交且线程池无法执行时该策略会让提交任务的线程直接执行该任务。这提供了最完善的处理方式因为它避免了任务丢失但可能会因为任务提交速度过快而导致程序阻塞。
6、如何合理设置线程池的大小 想要合理配置线程池线程数的大小需要分析任务的类型任务类型不同线程池大小配置也不同。
配置线程池的大小可根据以下几个维度进行分析来配置合理的线程数
任务性质可分为CPU密集型任务IO密集型任务混合型任务。 任务的执行时长。 任务是否有依赖——依赖其他系统资源如数据库连接等。 CPU密集型任务 尽量使用较小的线程池一般为CPU核心数1。 因为CPU密集型任务使得CPU使用率很高若开过多的线程数只能增加上下文切换的次数因此会带来额外的开销。
IO密集型任务 可以使用稍大的线程池一般为2*CPU核心数1。 因为IO操作不占用CPU不要让CPU闲下来应加大线程数量因此可以让CPU在等待IO的时候去处理别的任务充分利用CPU时间。
混合型任务 可以将任务分成IO密集型和CPU密集型任务然后分别用不同的线程池去处理。 只要分完之后两个任务的执行时间相差不大那么就会比串行执行来的高效。 因为如果划分之后两个任务执行时间相差甚远那么先执行完的任务就要等后执行完的任务最终的时间仍然取决于后执行完的任务而且还要加上任务拆分与合并的开销得不偿失
依赖其他资源 如某个任务依赖数据库的连接返回的结果这时候等待的时间越长则CPU空闲的时间越长那么线程数量应设置得越大才能更好的利用CPU。
到这里就结束感谢大家的支持我会继续努力的