jdk源码学习之JUC总结(2)

一、Executor架构

1.常见的线程池

常见的线程池有4种:

  1. singleThreadPool:只有一个线程的线程池。通过将核心线程和最大线程设为1实现。
  2. fixedThreadPool:特定数量线程的线程池。通过设置核心线程和最大线程实现。
  3. cacheThreadPool:无限线程的线程池。设置核心线程为0,阻塞队列为synchronousQueue,最大线程为MAX_INTEGER。
  4. scheduleThreadPool:定时任务线程池。
    通过Excutors创建的这4种线程池基本可以满足大部分场景,还可以通过new ThreadPoolExcutor()来自定义参数创建,下面分析参数如何设置。

2.线程池配置分析

  1. corePoolSize:核心线程数,也是正常情况下的工作线程数。当接收到任务后如果核心线程不满,就创建线程执行任务。
  2. BlockingQueue:如果核心线程满了,再提交任务时,将会把任务存放到阻塞队列。
  3. maximumPoolSize:最大线程数,当阻塞队列满了之后,再提交任务就会继续创建线程知道最大线程数。
  4. keepAliveTime,TimeUnite:线程存活时间和时间单位。
  5. threadFactory:创建线程的工厂。
  6. handler:线程达到最大线程的执行策略:
    • 直接丢弃
    • 丢弃并抛异常
    • 丢弃队首任务
    • 由调用线程处理任务

3.Futrue机制

Future保存了线程池执行任务的返回结果和执行状态,并且当任务提交后会返回一个虚拟的结果,此时可以处理其他操作,可以等到真正的结果返回时再处理。

二、阻塞队列

线程池常用的阻塞队列有:

  1. ArrayBlockingQueue:有界的阻塞队列,底层使用数组实现。
  2. LinkedBlockingQueue:底层是链表的阻塞队列,可定义界,默认为MAX_INTEGER;
  3. SynchronousQueue:只能存储一个元素的阻塞队列。
  4. PriorityBlockingQueue:有顺序的阻塞队列,内部元素许实现comparable接口。