线程池
是一种基于池化思想管理线程的工具。
优点
- 降低资源消耗
- 提高响应速度
- 提高线程的管理性
创建ThreadPoolExecutor
java
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
- corePoolSize:核心线程数,线程池初始化时默认是没有线程的,当任务来临时才开始创建线程去执 行任务
- maximumPoolSize:最大线程数,在核心线程数已满,且队列已满时,如果池子里的工作线程数小于maximumPoolSize,则会创建非核心线程执行任务
- keepAliveTime:非核心线程数的空闲时间超过keepAliveTime就会被自动终止回收掉,但在corePoolSize=maximumPoolSize时,该值无效,因为不存在非核心线程
- unit:keepAliveTime的时间单位
- workQueue:用于保存线程任务的队列,主要分为无界、有界、同步移交等队列,当池子里的工作线程数大于corePoolSize,就会将新进来的线程任务放入队列中
1)ArrayBlockingQueue(有界队列):队列长度有限,当队列满了就需要创建非核心线程执行任务,如果最大线程数已满,则执行拒绝策略
2)LinkedBlockingQueue(无界队列):队列长度无限,当任务处理速度跟不上任务创建速度,可能会导致内存占用过多或OOM
3)SynchronousQueue(同步队列):队列不作为任务的缓冲处理,队列长度为0 - threadFactory:创建线程的工厂接口,默认使用Executors.defaultThreadFactory();另外可以实现ThreadFactory接口,自定义线程工厂
- handler:线程池无法继续接收任务时(workQueue已满和maximumPoolSize已满)的拒绝策略
1)AbortPolicy:默认拒绝策略,中断抛出RejectedExecutionException异常
2)CallerRunsPolicy:让提交任务的主线程来执行任务
3)DiscardOldestPolicy:丢弃在队列中存在时间最久的任务,重复执行
4)DiscardPolicy:丢弃任务,不进行任何通知
5)另外可以实现RejectedExecutionHandler接口,自定义拒绝策略
提交任务
- 无返回值的任务使用 public void execute(Runnable command) 方法提交;
- 有返回值的任务使用:
Future<?> submit(Runnable task) : 提交Runnable任务
Future submit(Runnable task, T result): 提交Runnable任务并指定执行结果
Future submit(Callable task) : 提交Callable任务
