一、ThreadPoolExecutor简介
使用线程池主要为了解决一下几个问题:
- 通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销。
- 对线程进行一些维护和管理,比如定时开始,周期执行,并发数控制等等。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
ThreadPoolExecutor参数
- corePoolSize:核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会受存keepAliveTime限制。除非将allowCoreThreadTimeOut设置为true。
- maximumPoolSize:线程池所能容纳的最大线程数。
- keepAliveTime:非核心线程的闲置超时时间,超过这个时间就会被回收。
- unit:指定keepAliveTime的单位,如TimeUnit.SECONDS。
- workQueue:线程池中的任务队列.常用的有三种队列,SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue。
- threadFactory:线程工厂,提供创建新线程的功能。默认:DefaultThreadFactory
- handler:当任务队列满并且线程数达到maximumPoolSize时,会调用RejectedExecutionHandler.rejectedExecution()方法,默认:AbortPolicy
JDK自带的RejectedExecutionHandler
- DiscardOldestPolicy:会丢弃workQueue中最老的任务,这个Runnable放入workQueue。
- AbortPolicy:直接throw RejectedExecutionException。
- CallerRunsPolicy:在主线程执行这个Runnable。
- DiscardPolicy:不处理,丢弃这个Runnalbe。
- NewThreadRunsPolicy:新起线程执行Runnable。
二、ThreadPoolExecutor源码
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1,10,10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("aa");
}
};
threadPoolExecutor.submit(runnable);
- 如果当前工作线程数<corePoolSize,新增一个Worker,Worker直接执行当前Runnable。
- 如果线程池是运行状态,并且workQueue未满,Runnable入队列。二次校验线程池是运行状态和Worker数,如果线程池已暂停,则Runnable出队列,RejectedExecutionHandler处理。如果Worker==0,新增Worker。
- 如果workQueue已满并且线程池Worker数<maximumPoolSize,新增Worker,并立即执行Runnable。如果线程池Worker数>=maximumPoolSize,则拒绝消息,RejectedExecutionHandler处理。
- 新建一个Worker对象,Worker implements Runnable,并且start这个Worker。
- 线程Worker.runWorker方法会调用getTask()去workQueue取task,如果getTask()返回无task,线程Worker执行完成,线程关闭。
- 如果allowCoreThreadTimeOut=true或者workerCount>corePoolSize,则time=true。
- 如果time=true,表示workerCount>corePoolSize,则workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS)会在keepAliveTime时间后返回,如果取不到task,Worker线程关闭。如果time=false,workQueue.take()会block线程,直到有新的task进入workQueue。
- 大小: 97.6 KB
- 大小: 74.1 KB
- 大小: 77.7 KB
- 大小: 83.9 KB
分享到:
相关推荐
ThreadPoolExecutor源码解析.pdf
ThreadPoolExecutor源码解析.md
线程池原理-ThreadPoolExecutor源码解析 1.构造方法及参数 2.阻塞对列: BlockingQueue 3.线程工厂: DefaultThreadFactory 4.拒绝策略: RejectedExecutionHandler 5.执行线程 Executor
线程池ThreadPoolExecutor底层原理源码分析
对于线程池的核心类ThreadPoolExecutor来说,有哪些重要的属性和内部类为线程池的正确运行提供重要的保障呢? ThreadPoolExecutor类中的重要属性 在ThreadPoolExecutor类中,存在几个非常重要的属性和方法,接下来,...
zxing.java源码解析 StudyRoad Java & Android 知识点备忘 Java SE Thinking in Java [Java I/O](/Thinking-in-Java/Java IO.md) Android Android组件 Drawable 自定义Drawable View View工作过程 View事件分发机制 ...
前言对于多线程,大家应该很熟悉。但是,大家了解线程池吗?今天,我将带大家全部学习关于线程池的所有知识。 目录 1. 简介 2. 工作原理 2.1 核心参数线程池中有6个... Executor executor = new ThreadPoolExecutor
(2) 深度解析ThreadPoolExecutor类源码 (3) 从源码角度分析创建线程池究竟有哪些方式 2、基础案例篇 (1) 导致并发编程频繁出问题的“幕后黑手” (2)工作了3年的程序员小菜面试高并发岗位被吊打虐哭 (3)如何解决可见...
的事件分发机制实例和源码解析。 本篇参照郭神 Blog 中的实例,来分析 ViewGroup 的事件分发机制。 本章介绍 View(视图) 动画相关概念以及应用。 本篇介绍 Handler 和 Message 以及 Looper 的基本用法和工作原理。 ...
1.简介 android.os.AsyncTask,一个执行异步操作的类,我们可以使用它来处理后台任务,并且在UI线程中... 例如{@link Executor},{@ link ThreadPoolExecutor}和{@link FutureTask}。 2.基本使用 2.1 关键API andro
3.4.2 事件分发的源码解析 144 3.5 View的滑动冲突 154 3.5.1 常见的滑动冲突场景 155 3.5.2 滑动冲突的处理规则 156 3.5.3 滑动冲突的解决方式 157 第4章 View的工作原理 174 4.1 初识ViewRoot和DecorView ...
3.4.2 事件分发的源码解析 / 144 3.5 View的滑动冲突 / 154 3.5.1 常见的滑动冲突场景 / 155 3.5.2 滑动冲突的处理规则 / 156 3.5.3 滑动冲突的解决方式 / 157 第4章 View的工作原理 / 174 4.1 初识...
│ 高并发编程第二阶段46讲、ClassLoader链接阶段(验证,准备,解析)过程详细介绍.mp4 │ 高并发编程第二阶段47讲、ClassLoader初始化阶段详细介绍clinit.mp4 │ 高并发编程第二阶段48讲、JVM内置三大类加载器...
│ 高并发编程第二阶段46讲、ClassLoader链接阶段(验证,准备,解析)过程详细介绍.mp4 │ 高并发编程第二阶段47讲、ClassLoader初始化阶段详细介绍clinit.mp4 │ 高并发编程第二阶段48讲、JVM内置三大类加载器...