0.0.1. ThreadPoolExecutor
1 | public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) |
- corePoolSize: 核心线程数, 如果运行的线程少于corePoolSize, 则创建新线程来执行新任务, 即使线程池中的其他线程是空闲的
- maximumPoolSize:最大线程数, 可允许创建的线程数, corePoolSize和maximumPoolSize设置的边界自动调整池大小:
- corePoolSize <运行的线程数< maximumPoolSize:仅当队列满时才创建新线程
- corePoolSize=运行的线程数= maximumPoolSize: 创建固定大小的线程池
- keepAliveTime:如果线程数多于corePoolSize, 则这些多余的线程的空闲时间超过keepAliveTime时将被终止
- unit:keepAliveTime参数的时间单位
- workQueue:保存任务的阻塞队列, 与线程池的大小有关:
- threadFactory:使用ThreadFactory创建新线程, 默认使用defaultThreadFactory创建线程
- handle:定义处理被拒绝任务的策略, 默认使用ThreadPoolExecutor.AbortPolicy, 任务被拒绝时将抛出RejectExecutorException
0.0.2. CompletionService
0.0.3. 默认线程池的分类
- newSingleThreadExecutor
- newCachedThreadPool
- newFixedThreadPool
- newScheduledThreadPool
- newSingleThreadScheduledExecutor
0.0.4. 线程池的状态
- RUNNING
- SHUTDOWN
- STOP
- TIDYING
- TERMINATED
0.0.5. 添加任务的过程
- 如果此时线程池中的数量小于corePoolSize, 即使线程池中的线程都处于空闲状态, 也要创建新的线程来处理被添加的任务.
- 如果此时线程池中的数量等于corePoolSize, 但是缓冲队列 workQueue未满, 那么任务被放入缓冲队列.
- 如果此时线程池中的数量大于corePoolSize, 缓冲队列workQueue满, 并且线程池中的数量小于maximumPoolSize, 建新的线程来处理被添加的任务.
- 如果此时线程池中的数量大于corePoolSize, 缓冲队列workQueue满, 并且线程池中的数量等于maximumPoolSize, 那么通过 handler所指定的策略来处理此任务.
0.0.6. 拒绝策略
- AbortPolicy
当任务添加到线程池中被拒绝时, 它将抛出 RejectedExecutionException 异常. - CallerRunsPolicy
当任务添加到线程池中被拒绝时, 会在线程池当前正在运行的Thread线程池中处理被拒绝的任务.自动重试提交任务, 直到成功. - DiscardOldestPolicy
当任务添加到线程池中被拒绝时, 线程池会放弃等待队列中最旧的未处理任务, 然后将被拒绝的任务添加到等待队列中. - DiscardPolicy
当任务添加到线程池中被拒绝时, 线程池将丢弃被拒绝的任务.