线程池的创建使用
线程池的构造方法
ThreadPoolExecutor
(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,RejectedExecutionHandler handler)
1.corePoolSize 表示线程池的大小
如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。
2. maximumPoolSize 线程池最大大小
3.keepAliveTime 线程的存活时间
4.TimeUnit 线程活动保持的时间单位
55.workQueue 表示任务队列 用于保存等待执行的任务的阻塞队列 常见的几种队列
a.ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
b.LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列
c.SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
d.PriorityBlockingQueue:一个具有优先级的无限阻塞队列。
6.ThreadFactory 工厂,用于设置创建线程的工厂。
7.RejectedExecutionHandler(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务
常见的策略
a.AbortPolicy:直接抛出异常。
b.CallerRunsPolicy:只用调用者所在线程来运行任务。
c.DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
d.DiscardPolicy:不处理,丢弃掉
8.常见的自定义线程
Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)
Executors.newFixedThreadPool(int)(固定大小线程池)
Executors.newSingleThreadExecutor()(单个后台线程)