目录
线程池的优势
特点:线程复用,控制最大并发数,管理线程。
ThreadPoorExecutor参数含义
coreThreadSize:核心线程池,线程池中固定线程数。
maxmumThreadSize:线程池中能够创建的最大线程数。
workQueue:阻塞队列,当任务数量大于核心线程数时,任务会放到阻塞队列中。
keepAliveTime:当阻塞队列中的任务数处理完后,临时线程距离销毁的时间。
Unit: keepAliveTime的空闲时间。
ThreadFactory:创建线程的工厂,一般为默认。
RejectHandle:拒绝策略。
线程池的工作原理:
当任务数小于核心线程数时,由核心线程处理。
当并发大于核心线程数时,大于核心线程数的请求任务将会加入阻塞队列,
如果阻塞队列也满了则会开启创建最大线程数,
如果最大线程数也满了,就会执行拒绝策略。
四大拒绝策略
AbordPolicy(默认策略):当超过最大线程数最接抛出异常(一般生产不用)。
CallerRunPolicy:调用者运行策略,超过最大线程数,就会将超出的任务回退给调用者。
discardOldsPolicy:抛弃队列中等待最久的任务,将当前任务加入队列中尝试再次提交当前任务。
discardPolicy::直接抛弃任务,不做任何处理,也不抛出异常,如果允许丢失这是一种最好的策略。
工作中怎么创建线程池:
阿里为什么不推荐使用Excutors创建线程(阿里手册)使用executors创建线程池返回对象的弊端?
1)FixedThreadPool和SingleThreadPool
允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
2)CachedThreadPool和ScheduledThredPool
允许的创建的线程的数量为Integer.MAX_VALUE, 可能会创建大量的线程,从而导致OOM。
工作中都是通过New ThreadPoorExcuter()自定义创建线程池,创建成有界队列。
合理配置线程池线程数?
合理配置线程池线程池中最大线程数是多少?怎么设置的?
首先获取硬件的cpu核心线程数:
Runtime.getRuntime().availableProcessors();
配置线程池分两种情况
第一种是CPU密集型的
假如CPU是8核,配高一个(即最大线程数为9),减少cpu的切换。
第二种是IO密集型
公式一:CPU核数*2
公式二:CPU核数/(1-0.9)阻塞系数是0.8~0.9