首页 > 其他分享 >你真的了解线程池吗?

你真的了解线程池吗?

时间:2023-07-01 19:59:04浏览次数:30  
标签:执行 队列 创建 任务 了解 线程 核心 真的

前言

真实高并发场景下,项目一般不会直接使用 Thread 类创建线程,而是使用线程池来创建并管理线程。对于程序员来说,学好线程池对于并发编程是非常重要的。

为什么要使用线程池

主要有以下三方面的原因:

  1. 频繁的创建/销毁线程需要消耗系统资源,线程需要重新被cpu从就绪到运行状态调度,需要发生cpu的上下文切换,效率非常低。
  2. 并发数量过多,可能会导致资源消耗过多,从而造成服务器崩溃。(主要原因)
  3. 可以对线程做统一管理。

ThreadPoolExecutor 参数

  • int corePoolSize: 核心线程数
  • int maximumPoolSize: 最大线程数
  • long keepAliveTime: 超出corePoolSize后创建的线程的存活时间
  • TimeUnit unit: keepAliveTime的时间单位
  • BlockingQueue workQueue: 阻塞队列,维护着等待执行的Runnable任务对象
  • ThreadFactory threadFactory: 创建线程的线程工厂

执行过程 :

  1. 当线程数小于核心线程数时,创建线程。
  2. 当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
  3. 当线程数大于等于核心线程数,且任务队列已满时:
  • 若线程数小于最大线程数,创建线程
  • 若线程数等于最大线程数,执行拒绝策略

拒绝策略

线程池提供了4种拒绝策略,分别如下:

  • AbortPolicy:直接抛出异常,这也是默认的策略。。
  • CallerRunsPolicy:使用调用者所在的线程来执行任务。
  • DiscardOldestPolicy:丢弃队列中最靠前的任务并执行当前任务。
  • DiscardPolicy:直接丢弃当前任务。

如何设置线程数

合理地设置核心线程数和最大线程数可以优化线程池的性能和响应时间。建议如下:

  • 核心线程数 = CPU核心数 + 1
  • 最大线程数 = 核心线程数 * 2
  • 如果任务执行时间较长,可以适当增加最大线程数,以避免任务堆积在队列中无法及时处理

总结

本文详解了线程池的概念以及执行流程,在生产过程中如何合理的使用还需要线上的验证,希望本文对大家有帮助!

标签:执行,队列,创建,任务,了解,线程,核心,真的
From: https://www.cnblogs.com/GentleJim/p/17519806.html

相关文章

  • 创建多线程程序两种方式的区别
    1、使用实现Runnable接口的方式创建多线程程序,可以避免单继承的局限性a.类继承了Thread类,就不能在继承其他的类了b.类实现了Runnable接口,还可以继承其他的类2、使用实现Runnable接口的方式创建多线程程序,可以把设置线程任务和开启线程进行解耦(解除了耦合性,增强......
  • 带你了解什么是无锁并发 CAS
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家✌......
  • 踩坑日记:BigDecimal四大坑,真的会用BigDecimal?
    一、前言最近在项目中使用BigDecimal存储订单的数量,数据库保留三位小数。需求是数量变化了就会有其他操作,头脑发热顺手写了个equals进行判断是不是相等!后来怎么测都是不相等!百思不得其解,看了一下equals方法才知道!BigDecimal值的比较官方推荐是compareTo的,如果数据库没有保留小数,用e......
  • 靳宇灵 | CHATGPT真的很强大,很快帮我解决了tp5对接腾讯cos存储的SDK,NB!!
    php请求腾讯云cos存储SDK报错ThrowableErrorinClient.phpline229致命错误:CalltoundefinedfunctionCos\region_map()这个错误的原因是您在使用腾讯云cos存储SDK时,调用了一个未定义的函数 Cos\region_map()。首先,您需要确保安装了腾讯云cos存储SDK。可以通过Composer进......
  • 30秒了解Mysql
    本篇主要是一文带大家大致了解什么是Mysql。本篇文章主要涉及的内容有:什么是数据库?数据库中的几个基本术语?Mysql中InnoDB引擎支持的4种事务隔离级别Mysql中如何使用ENUM?Mysql中的存储引擎mysql中char与varchar的区别?主键和候选键的区别?blob和text的区别?Mysql中的锁数据库三范式什么......
  • 30秒了解Mysql
    本篇主要是一文带大家大致了解什么是Mysql。本篇文章主要涉及的内容有:什么是数据库?数据库中的几个基本术语?Mysql中InnoDB引擎支持的4种事务隔离级别Mysql中如何使用ENUM?Mysql中的存储引擎mysql中char与varchar的区别?主键和候选键的区别?blob和text的区别?Mysql中的锁数据......
  • C++面试八股文:std::vector了解吗?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第23面:面试官:vector了解吗?二师兄:嗯,用过。面试官:那你知道vector底层是如何实现的吗?二师兄:vector底层使用动态数组来存储元素对象,同时使用size和capacity记录当前元素的数量和当前动态数组的容量。如果持续的push_back(empl......
  • 一篇带你了解JVM内存模型和垃圾回收机制
    JVM内存模型根据Java虚拟机规范,Java数据区域分为五大数据区域。 JVM的结构其中方法区和堆是所有线程共享的,虚拟机栈、本地方法栈和程序计数器则为线程私有的。有的博客称方法区是永久代,那是因为前者是JVM的规范,而后者则是JVM规范的一种实现,并且只有HotSpot才有永久代,JDK8......
  • Sentinel的线程隔离与Hystix的线程隔离有什么差别?
    Hystix默认是基于线程池实现的线程隔离,每一个被隔离的业务都要创建一个独立的线程池,线程过多会带来额外的CPU开销,性能一般,但是隔离性更强。Sentinel是基于信号量(计数器)实现的线程隔离,不用创建线程池,性能较好,但是隔离性一般。......
  • 浅谈一下c#多线程编程
    概念线程:线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。同步:一定要等任务执行完了,得到结果,才执行下一个任务。如果程序执行耗时操作时会阻塞线程。应用场景UI与I/O:UI发出I/O操作,I/O操作是费时任务计算密集型工作(CPU-boun......