线程池创建
Executors.**newFixedThreadPool(int)**一池N线程,控制最大的并发数,超出的线程会在队列中等待
Executors.**newSingleThreadExecutor()**一池一线程
Executors.**newCachedThreadPool()**一池可扩容根据需求创建线程,可灵活回收空闲线程
执行完线程,可不用再扩建继续使用
Executors.newScheduledThreadPool(),支持定时及周期性任务执行
核心参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
- corePoolSize:线程池中常驻核心线程数
- maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于1
- keepAliveTime:多余空闲线程的存活时间。当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余空闲线程会被销毁直到剩下corePoolSize为止。
- unit:keepAliveTime的单位
- workQueue:里面放了被提交但是尚未执行的任务,当池子里的工作线程数大于corePoolSize时,这时新进来的任务会被放到队列中
- threadFactory:表示线程池中工作线程的线程工厂,用于创建线程
- handler:拒绝策略,当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时,对任务的拒绝方式。
workqueue
1.ArrayBlockQueue
(基于数组的有界队列,FIFO)
2.LinkedBlockQueue
(基于链表的无界阻塞队列,Integer.MAX FIFO)Tips:此时maximunPoolSize参数没用
3.SynchronousBlockQueue
(不缓存任务队列)没有容量,进去一个元素必须等待取出来后才能往里面放一个元素。
4.PriorityBlockQueue
(优先级队列)(基于Comparator实现 比较 无界 阻塞队列)
拒绝策略
1.CallerRunsPolicy
不进入线程池执行,在这种方式(CallerRunsPolicy)中,任务将由调用者线程去执行。
2.AbortPolicy
当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
(该策略下,直接丢弃任务,并抛出RejectedExecutionException异常)
3.DiscardPolicy
当任务添加到线程池中被拒绝时,默认情况下它将丢弃被拒绝的任务。(即该策略下,直接丢弃任务,什么都不做)
4.DiscardOldestPolicy
当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
(该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列)