根据阿⾥java开发⼿册,使⽤的创建线程池⽅法
根据阿⾥java开发⼿册,使⽤的创建线程池⽅法
阿⾥java开发⼿册规定
3. 【强制】线程资源必须通过线程池提供,不允许在应⽤中⾃⾏显式创建线程。
说明:使⽤线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资
java线程池创建的四种源不⾜的问题。如果不使⽤线程池,有可能造成系统创建⼤量同类线程⽽导致消耗完内存或者
“过度切换”的问题。
4. 【强制】线程池不允许使⽤ Executors 去创建,⽽是通过 ThreadPoolExecutor 的⽅式,这样
的处理⽅式让写的同学更加明确线程池的运⾏规则,规避资源耗尽的风险。
说明: Executors 返回的线程池对象的弊端如下:
1) FixedThreadPool 和 SingleThreadPool :
允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积⼤量的请求,从⽽导致 OOM 。
2) CachedThreadPool 和 ScheduledThreadPool :
允许的创建线程数量为 Integer.MAX_VALUE ,可能会创建⼤量的线程,从⽽导致 OOM 。
总结出的创建线程池⽅式
private static final ThreadPoolExecutor EXECUTOR_SERVICE = new ThreadPoolExecutor(5,100,60,TimeUnit.SECONDS,new ArrayBlockingQueue<>(10 0),
new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()
,new ThreadPoolExecutor.CallerRunsPolicy());
//这⾥使⽤的是ThreadPoolExecutor的完整版构造函数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
对各个参数做下说明
参数作⽤说明
corePoolSize核⼼线程数量,线程池初始化时设定—
maximumPoolSize 线程池最⼤线程数(⾮核⼼线程) 核⼼线程 和 ⾮
核⼼线程 共同使⽤线程池、但是核⼼线程是不会被
回收的、回收条件是线程池中的线程数量⼤于核⼼
线程数
corePoolSize ⼤⼩和 maximumPoolSize ⼤⼩⼀致的话 线程池中
的线程将不会空闲、 keepAliveTime 和 timeUnit 就不会再起作⽤
keepAliveTime 如果当前线程池中线程数⼤于corePoolSize。多余
的线程、在等待keepAliveTime时间后如果还没有
新的线程任务指派给它、它就会被回收
—
unit等待时间keepAliveTime的单位—
workQueue等待队列默认SynchronousQueue⼀个没有存储空间的阻塞队列,将任务同步交付给⼯作线程;可以使⽤⽆界队LinkedBlockingQueue;有界队列ArrayBlockingQueue;以及优先级队列
PriorityBlockingQueue
RejectedExecutionHandler饱和策略下⾯对饱和策略有个详细说明ThreadFactory主要是对我们的线程进⾏⼀个命名
对饱和策略做个说明
策略作⽤说明
AbortPolicy 终⽌策略是默认的饱和策略,当队列满时,会抛出⼀个RejectExecutionException异常,客户可以捕获这个异常,根
据需求编写⾃⼰的处理代码
没有真
正解决
问题
DiscardPolicy策略会悄悄抛弃该任务。不建议使⽤
DiscardOldestPolicy 策略将会抛弃下⼀个将要执⾏的任务,如果此策略配合优先队列PriorityBlockingQueue,该策略将会抛弃优先级最⾼
的任务
不建议
使⽤
CallerRunsPolicy 调⽤者运⾏策略,该策略不会抛出异常,不会抛弃任务,⽽是将任务回退给调⽤者线程执⾏(调⽤execute⽅法的线
程),由于任务需要执⾏⼀段时间,所以在此期间不能提交任务,从⽽使⼯作线程有时间执⾏正在执⾏的任务。
推荐使
⽤
策略作⽤说明
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论