1.ThreadPoolExecutor 构造器参数解析
1.1 int corePoolSIze 核心线程池大小
线程池内主力;当线程池刚创建时,线程池内不会主动创建线程,只有当任务来临才会考虑创建线程;任务结束,并不会销毁线程,而是将线程放入线程池中;当线程池的线程数==corePoolSize
1.2 int maximumPoolSize 线程池最大的容量(maximumPoolSize - corePoolSIze 的差值相当于球员的后备队员)
当任务结束,属于差值的线程,将被销毁
1.3 long keepAliveTime 会被销毁的线程--缓存时间
1.4 TimeUnit unit 缓存时间的单位
1.5 四种阻塞的队列,(也就是当线程池满了之后,再进来的任务都会放到这个阻塞队列中等待)
SynchronousQueue --直接提交策略(适用于CachedThreadPool);直接将任务交给线程,若不存在可用的线程,加入队列将失败,失败将创建一个新线程。(问题:此队列将严重依赖maximumPoolSize 的大小,以避免拒绝新提交的任务)
LinkedBlockingQueue --无界队列(适用于FixedThreadPool与SingleThreadExcutor),基于链表的阻塞队列,创建的线程数不会超过corePoolSizes(maximumPoolSize值与其一致),当线程正忙时,任务进入队列等待。按照FIFO原则对元素进行排序,吞吐量高于ArrayBlockingQueue
ArrayListBlockingQueue——有界队列;有界队列,有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量
????第四种阻塞队列呢?
1.6 RejectedExecutionHandler handler 无法执行任务的策略(当阻塞队列满了,后备线程也满了,将启动)
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
1.7 threadFactory 用于创建线程