!通过阅读Android开发艺术探索整理
常用构造方法:
[代码]java代码:
1 | public ThreadPoorExecutor( int corePoorSize, int maximumPoorSize, long keepAliveTime,TimeUnit unit,BlockingQuene <runnable> workQuene,ThreadFactory threadFactory)</runnable> |
corePoorSize:核心线程数,即使闲置也会一直存活。配合allowCoreTreadTimeOut与keepAliveTime可指定闲置时的超时时长
maximumPoorSize:线程池所能容纳的最大线程数量,超过后,后续任务将阻塞
keepAliveTime:非核心线程的闲置超时时长
unit:超时时间单位,枚举类型
workQuene:任务队列,存储通过excutor提交的Runnable对象
threadFactory:接口,new Thread(Runnable) 提供创建新线程的功能
RejectedExecutionHandler:不常用,当线程无法执行新任务时会调用handler.rejectedExecution通知调用者
执行任务时的规则:
线程数量未达到核心线程数,直接启动一个核心线程
线程数量已经或超过核心线程数量,任务会插入到任务队列中等待
由于任务队列已满,无法将任务插入到任务队列,如果线程数量未达到线程池最大值,启动非核心线程执行任务
线程数量已达到最大值,拒绝执行任务
常见四大分类:
Cached:只有非核心线程,线程数最大为Integer.MAX_VALUE。闲置线程超时时间为60s。所有线程都活动时会创建新线程,否则使用闲置的,适合大量且耗时较少任务
Fixed :任务队列没有限制,没有超时机制,空闲时不会被回收,除非线程池被关闭。所有线程都活动时新任务会等待,只有核心线程,线程数量固定
Scheduled:核心线程数固定,线程数量不固定,非核心线程闲置时立即回收。适合周期、定时任务。
SingleThread:只有一个核心线程,所有任务在同一线程中按顺序执行。统一所有外界任务到同一个线程
任务提交方法:execute(Runnable)
引申一个面试题:主线程开启一个线程池,只有一个核心线程,多次循环、只创建一个Runnable,Runnable是否会多次执行?
以下内容来源于高手解答:
答案是会多次执行。
1.Runnable只是接口,封装线程待执行的代码
2.执行时间与执行次数与线程有关,与Runnable无关
3.Runnable可以N次执行,即使限定线程池最大数也可以重复执行