线程池
2019-11-18 10:30:35 2 举报
AI智能生成
java线程池
作者其他创作
大纲/内容
拒绝策略
AbortPolicy (默认): 该策略会直接抛出异常,阻止系统正常工作
CallerRunsPolicy : 只要线程未关闭,该策略直接调用者线程中执行将被丢弃的任务,这样的话不会真正抛弃任务,但会影响提交线程的性能。(会退给调用者)
DiscardOldestPolicy : 丢弃最开始的(即将被执行的)任务,并尝试再次提交任务。
DiscardPolicy : 该策略将直接丢弃无法处理的任务,不予任何处理
自定义拒绝策略:继承RejectedExecutionHandler接口,重写rejectedExecution方法
自定义线程池和拒绝策略
实际生产中不用Executore初始化线程池,因为底层使用的阻塞队列是无界队列,容易造成oom
如何合理配置线程
CPU密集型
IO密集型
IO密集型的任务不是一直在执行任务,所以尽可能的配多一点CPU核数*2
IO密集型任务每个线程都会大量的阻塞计算公式:CPU核数/(1-阻塞系数) 阻塞系数 = 0.8 ~0.9之间
WorkQueue(阻塞队列)
是什么
分类
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
JVM的参数类型
标配参数
-version
-help
X 参数(了解)
-Xint:解释执行
-Xcomp:第一次使用就编译成本地代码
-Xmixed:混合模式
XX 参数
Boolean 类型:-XX:+ 或者 - 某个属性值(+ 表示开启,- 表示关闭)
KV 设置类型:-XX:key=value
jinfo -flag
参看默认参数
查看JVM初始默认值:-XX:+PrintFlagsInitial
查看修改更新:-XX:+PrintFlagsFinal
打印命令行参数(可以看默认垃圾回收器):-XX:+PrintCommandLineFlags
基本参数
-Xms
-Xmx
-Xss
-Xmn
-XX:MetaspaceSize
-XX:+PrintGCDetails
-XX:SurvivorRatio
-XX:NewRatio
-XX:MaxTenuringThreshold
线程池
介绍
线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。
特点
他的主要特点为:线程复用;控制最大并发量;管理线程;
架构说明
编码实现
Executors.newFixedThreadPool(int); 一池固定处理线程
底层实现
newFixedThreadPool():该方法将返回一个固定线程数量的线程池,该线程池的数量将始终不变(核心线程数与最大线程数相等)。当一个线的任务提交时,线程池中若有空闲的线程,则立即执行,否则将会将任务添加到任务队列中,等到线程空闲时,再处理任务队列中的任务,但是由于它采用的阻塞队列是 LinkedBlockingQueue,是一个最大值很大(Integer.MAX_VALUE)的队列,也可以认为是无界队列,当线程池中的任务处理不及时的时候,而一边又疯狂的提交任务,将会导致OOM发生。
适合执行长期的任务,性能好很多
Executors.newSingleThreadExecutor(); 一池一个处理线程
newSingleThreadExecutor:可见这个方法,只会创建一个线程的线程池。多余的任务还是会被添加到 LinkedBlockingQueue中,也会有OOM情况的发生。
适合一个任务一个任务得场景
Executors.newCachedThreadPool(); 一池N个处理线程
底层
newCachedThreadPool:该方法将返回一个可根据实际情况调整的线程数量的线程池,线程池的数量不固定,我们可以看见上面的方法中设置的是corePoolSize为0,maximumPoolSize为整数最大值,保活时间为60秒,阻塞队列为SynchronousQueue,故线程池中有空闲线程可以复用的话,则会优先复用空闲线程,如果所有的线程都在工作的话,新的任务提交,直接会创建新的线程处理任务,所有线程处理完任务后,将会返回线程池进行复用。如果同时又大量任务提交,那么将会开启等量的线程,这样也会导致OOM。
适合执行很多短期异步的小程序,或者负载较轻的服务器
Executors.newScheduledThreadPool(int);
Executors.newWorkStealingPool();
ThreadPoolExecutor
七大参数
int corePoolSize : 指定了线程池中的常驻的核心线程数量
int maximumPoolSize : 线程池中最大线程数量
long keepAliveTime : 当线程池线程超过corePoolSize时,多余的空闲线程的存活时间。即,超过了corePoolSize的空间时间,在多长时间被销毁
TimeUnit unit : keepAliveTime的单位
BlockingQueue workQueue : 任务队列,被提交但尚未被执行的任务
RejectedExecutionHandler handler : 拒绝策略,当任务太多,来不及处理,如何执行拒绝任务
ThreadFactory threadFactory : 线程工厂,用于创建线程,可以利用guava线程工厂,默认也可
工作原理
原理
流程
提交任务后的执行过程
1、判断核心线程池是否已满,如果不是,则创建线程执行任务
2、如果核心线程池满了,判断队列是否满了,如果队列没满,将任务放在队列中
3、如果队列满了,则判断最大线程池是否已满,如果没满,创建线程执行任务
4、如果线程池也满了,则按照拒绝策略对任务进行处理
ThreadPoolExecutor扩展
beforeExecute:线程池中任务运行前执行
afterExecute:线程池中任务运行完毕后执行
terminated:线程池退出后执行
0 条评论
回复 删除
下一页