newFixedThreadPool(固定数目线程的线程池)
线程池特点:
- 核心线程数喝最大线程数大小一样
- 没有所谓的非空闲时间,即keepAliveTime为0
- 阻塞队列为无界队列LinkedBlockingQueue
工作机制:
- 提交任务
- 如果线程数少于核心线程,创建核心线程执行任务
- 如果线程数等于核心线程,把任务添加到LinkedBlockingQueue阻塞队列
- 如果线程执行完任务,去阻塞队列取任务,继续执行
使用场景:
- FixedThreadPool 适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能的少的分配线程,即适用执行长期的任务。
newCachedThreadPool(可缓存线程的线程池)
线程池特点:
- 核心线程数为0
- 最大线程数为Integer.MAX_VALUE
- 阻塞队列是SynchronousQueue
- 非核心线程空闲存活时间为60秒
工作机制:
- 提交任务
- 因为没有核心线程,所以任务直接加到SynchronousQueue队列。
- 判断是否有空闲线程,如果有,就去取出任务执行。
- 如果没有空闲线程,就新建一个线程执行。
- 执行完任务的线程,还可以存活60秒,如果在这期间,接到任务,可以继续存活下去;否则,被销毁。
使用场景:
- 用于并发执行大量短期的小任务。
newSingleThreadExecutor(单线程的线程池)
线程池特点:
- 核心线程数为1
- 最大线程数也为1
- 阻塞队列是LinkedBlockingQueue
- keepAliveTime为0
工作机制:
- 提交任务
- 线程池是否有一条线程在,如果没有,新建线程执行任务
- 如果有,将任务加到阻塞队列
- 当前的唯一线程,从队列取任务,执行完一个,再继续取,一个线程夜以继日地干活
使用场景:
- 适用于串行执行任务的场景,一个任务一个任务地执行。
newScheduledThreadPool(定时及周期执行的线程池)
线程池特点:
- 最大线程数为Integer.MAX_VALUE
- 阻塞队列是DelayedWorkQueue
- keepAliveTime为0
- scheduleAtFixedRate():按某种速率周期执行
- scheduleWithFixedDelay():在某个延迟后执行
工作机制:
- 添加一个任务
- 线程池中的线程从DelayQueue中取任务
- 线程从DelayQueue中获取time大于等于当前时间的tas
- 执行完后修改这个task的time为下次被执行的时间
- 这个task就回DelayQueue队列中
使用场景:
- 周期性执行任务的场景,需要限制线程数量的场景。