转载
线程池七大参数
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:除核心线程外的空闲线程存活时间
TimeUnit:keepAliveTime的单位
BlockingQueue:工作队列
ThreadFactory:线程工厂
RejectedExecutionHandler:拒绝策略
新任务来的时候,先看线程池是否被创建,如果没有被创建,则直接触发拒绝策略。如果当前线程池没有线程,则立即创建一个线程执行任务,如果核心线程全部被使用,将新来的任务添加到工作队列,如果工作队列已满,则创建新线程执行任务。如果总线程数超过最大线程数,会触发拒绝策略。任务执行结束后,空闲的非核心线程,会在超过keepAliveTime后被收回,核心线程不会被收回(除非设置allowCoreThreadTimeout=true,那么超过存活时间的核心线程也会被回收),在初始化线程池的时候,可以自定义线程工厂,可以指定线程池的名称等内容。
拒绝策略
1、AbortPolicy:丢弃任务并抛出RejectedexEcutionException异常。
2、DiscardPolicy:丢弃任务,但是不抛出异常,可能导致无法发现系统的异常状态。
3、DiscardOldeastPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务
4、CallerPolicy:由调用线程处理该任务
工作队列
1、ArrayBlockingQueue 数组阻塞队列:数组结构,初始化时传入一个大小。有界、FIFO、使用一个重入锁、默认使用非公平锁,入队和出队共用一个锁,互斥
2、LinkedBlockingQueue 链表阻塞队列:链表结构,默认初始化大小为Integer.MAX_VALUE。有界,FIFO,使用两个重入锁分别控制元素的入队和出队,用Condition进行线程间的唤醒和等待。
3、SynchronousQueue 同步队列:容量为0,添加任务必须等待任务取出、这个队列相当于通道,不存储元素
4、PriorityBlockingQueue 优先阻塞队列:无界,默认采用元素自然顺序升序排列
5、DelayQueue 延时队列:无界、元素有过期时间,过期的元素才被取出