网站首页 > 技术文章 正文
线程池的作用
当系统频繁的创建和销毁线程的时候,就会大大的降低系统的效率。线程池就是为了解决这个问题,使得线程在执行完一个任务的时候,不被销毁,而是继续执行下一个任务。可以有效的提高系统的效率。
线程池初步了解
线程池主要使用ExecutorService线程池接口。
如:ExecutorService pool = Executor.常见线程。
常见线程包括:
1. newCachedThreadExecutor 适用于执行短期异步的小程序或者负载较轻的服务器。
newCachedThreadExecutor是可缓存线程池,当线程池大小超过了执行任务所需的线程大小时,就会回收部分空闲(60秒无执行)的线程,当任务来时,又可智能的添加线程来执行。
2. newFixedThreadPool 适用于长期任务,性能较好
newFixedThreadPool 线程池的大小固定,每提交一个任务,就是一个线程,直至达到线程池的最大数量。然后后边进入的进入等待队列,直到前边的任务执行完毕才可以执行。
3. newSingleThreadPool 适用于一个任务一个任务执行的场景
newSingleThreadPool 单线程线程池,即线程池中只有一个线程,单线程串行执行任务。
4. newScheduleThreadPool 适用于周期性执行任务
newScheduleThreadPool 大小无限制的线程池,适用于定时和周期性的执行任务。
线程池的核心类ThreadPoolExecutor
ThreadPoolExecutor类的构造方法,
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandle handle)
TheadPoolExecutor类共有四个构造方法,最后两个参数可以没有,可以只有一个,可以两个都有。
几个参数的意义:
corePoolSize:核心池的大小。默认情况下,在创建线程池之后,线程池中线程个数为0,当任务来时,创建一个线程,当任务数达到corePoolSize之后,就会把后边来到的任务放入到缓存队列当中。这个corePoolSize还可以结合上一篇的生产者消费者模式,进行理解,它就是消费者线程的大小。
maximumPoolSize 最大线程数,表示线程池中最大可以创建的线程数。
keepAliveTime 线程活跃时间,表示线程在没有任务执行时,最长的存在多久不被结束。默认情况下,只有当线程池中线程超过corePoolSize时,才会起作用。
TimeUnit 线程池参数中keepAliveTime的单位,有7中静态属性,TimeUnit.DAYS,TimeUnit.HOURS,TimeUnit.MINUTES,SECONDS,MILLSECONDS,MICROSECONDS,NANOSECONDS。
BlockingQueue 阻塞队列,用于存储等待执行的任务。常见的选择有三种:ArrayBlockingQueue,LinkedBlockingQueue和SynchronousQueue。
ThreadFactory 线程工厂,用于创建线程。
RejectedExecutionExecute 当拒绝执行任务时的策略,有以下四种方式:ThreadPoolExecutor.AbortPolicy,丢弃任务并抛出异常,DiscardPolicy:丢弃任务,但不抛出异常。DiscardOldestPolicy:丢弃队列最前边的任务,并重新执行。CallerRunsPolicy:由调用线程处理任务。
线程池任务执行流程
当线程池中线程小于coreThreadPool时,每提交一个任务,线程池就创建一个新线程。
当线程达到coreThreadPool时,新提交的任务会被放到缓存队列中,等待系统调度。
当workQueue已满,且maximumThreadPool>coreThreadPool时,新提交任务,系统会创建新线程去执行任务。
当提交任务数,超过maximum时,新提交任务会交由RejectedExecutionHandle处理
当线程池中线程超过coreThreadPool,且空闲时间达到keepAliveTime时,系统会释放空闲线程。
当设置allowCoreThreadPoolTimeOut(ture)时,线程池中coreThreadPool达到keepAliveTime也将关闭。
实例演练
线程池大小设置
如果是CPU密集型的,尽量多使用CPU,可设置线程池大小为CPU核数+1,
如果是IO密集型的,可设置大小为2*CPU核数
- 上一篇: 关于Java线程池构造参数,你该了解这些
- 下一篇: 线程池:业务代码最常用也最容易犯错的组件
猜你喜欢
- 2024-10-22 线程池调优之动态参数配置 动态设置线程池大小
- 2024-10-22 java线程池参数及使用 java线程池的用法
- 2024-10-22 面试官:说说你对线程池的了解 线程池实现原理面试
- 2024-10-22 「每日分享」高阶程序员需要掌握的常见性能优化策略
- 2024-10-22 池化技术学习 池化方法
- 2024-10-22 「Java基础」「多线程」-线程池 java多个线程池
- 2024-10-22 线程池配置的常见误区 线程池配置参数有哪些
- 2024-10-22 创建线程池参数有哪些作用? 创建线程池的7个参数
- 2024-10-22 一文搞懂!多线程之间的通信及线程池
- 2024-10-22 码农大叔带你——解析线程池 线程池的主要处理流程
你 发表评论:
欢迎- 最近发表
-
- 吴谨言专访大反转!痛批耍大牌后竟翻红,六公主七连发力显真诚
- 港股2月28日物业股涨幅榜:CHINAOVSPPT涨1.72%位居首位
- 港股2月28日物业股午盘:CHINAOVSPPT涨1.72%位居首位
- 港股3月2日物业股涨幅榜:CHINAOVSPPT涨1.03%位居首位
- 港股3月2日物业股午盘:CHINAOVSPPT涨1.03%
- 天赋与心痛的背后:邓鸣贺成长悲剧引发的深刻反思
- 冯小刚女儿徐朵追星范丞丞 同框合照曝光惹人羡,回应网友尽显亲民
- “资本大佬”王冉:51岁娶小17岁童瑶,并承诺余生为娇妻保驾护航
- 港股3月2日物业股午盘:CHINAOVSPPT涨1.03%位居首位
- 「IT之家开箱」vivo S15 图赏:双镜云窗,盛夏风光
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)