线程池的作用是什么?
- 在java中,创建线程跟销毁线程是会消耗系统资源的,使用线程池可以复用线程,降低了资源消耗
- 复用线程池中的线程,在使用的时候由于避免了创建线程,可以达到提高响应速度
- 方便管理线程,线程池对线程统一管理,提供了阻塞队列,线程核心数等
线程池参数
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
}
corePoolSize:线程核心数,当向线程池提交任务的时候,如果当前线程池的线程数量小于corePoolSize,则会创建一个新的线程执行任务。如果大于核心数,则会将任务添加到阻塞队列中
maximumPoolSize:线程最大核心数,如果阻塞队列满了,如果当前线程数又少于maximumPoolSize,则会创建新的线程执行任务。如果线程数大于maximumPoolSize,则会执行拒绝策略。
keepAliveTime:空闲线程的存活时间
unit:存活时间单位
workQueue:阻塞队列
LinkedBlockingQueue(基于链表实现的阻塞队列)
ArrayBlockingQueue(基于数组实现的阻塞队列)
SynchronousQueue(只有一个元素的阻塞队列)
PriorityBlockingQueue(实现了优先级的阻塞队列)
DelayQueue(实现了延迟功能的阻塞队列)
threadFactory:线程创建工厂,通常用于设置线程名称
handler:拒绝策略
AbortPolicy(直接终止,抛出异常)
DiscardPolicy(默默丢弃,不抛出异常)
DiscardOldestPolicy(丢弃队列中最旧的任务,执行当前任务)
CallerRunsPolicy(返回给调用者执行)