线程池简单的认识:
为什么要用线程池
降低资源消耗
提高响应速度
提高线程的可管理性
ThreadPoolExecutor的类关系
Executor是一个接口,它是Executor的基础框
ExecutorService接口继承了Executor
AbstractExecutorService抽象类实现了ExecutorService接口中的大部分方法
ThreadPoolExecutor是线程池的核心实现类,用来执行被提交的任务
ScheduledExecutorService接口继承了ExecutorService接口,
提供了带周期执行的功能。
线程池创建各个参数的概念
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long
keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory
threadFactory,RejectedExecutionHandler handler)
corePoolSize
线程池中的核心线数量
maximumPoolSize
线程池中允许的最大线程数,如果当前阻塞队列满了,且继续提交任务,
则创建新的线程执行任务,前提是当前线程数小于maximumPoolSize
keepAliveTime
线程空闲的存活时间,即当前线程没有任务时,继续存活
的时间,该参数只有在线程数大于corePoolSize才生效
workQueue
用于保存等待执行的任务的阻塞队列。
threadFactory
可以为线程设置一个有识别度的线程名字。
RejectedExecutionHandler
线程池的饱和策略。
AbortPolicy 直接跑出异常,默认策略
CallerRunsPolicy 用调用者,所在的线程来执行任务
DiscardOldestPolicy 丢弃阻塞队列中最靠前的任务,并执行当前任务
DiscardPolicy 直接丢弃任务
扩展线程池
任务执行前后都会执行beforeExecute和afterExecute方法。
线程池的工作机制
如果当前运行的线程少于corePoolSize,则创建新线程来执行任务
如果如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue
如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处
理任务
如果创建新线程将使当前运行的线程超出maximumPoolSize,任务将被
拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法
提交任务
execute提交不需要返回值的任务
submite提交有返回值的任务
关闭线程池
shutdown,shutdownNow
通常调用shutdown 方法来关闭线程池,如果任务不一定要执行完,
则可以调用shutdownNow 方法。
shutdownNow 首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行
或暂停任务的线程