JAVA线程池
ThreadPoolExecutor
方法七个参数
- corePoolSize
- 核心线程池个数,日常维护的线程数量
- maximumPoolSize
- 最大线程数,线程池允许创建的最大线程数。任务进来先分配给核心线程,如果核心线程都在忙,则会进入到队列中,如果队列满了, 才会重新创建新的线程,如果线程数超过最大线程数,则执行拒绝策略
- keepAliveTime
- 线程池中空闲线程等待工作的超时时间。核心线程池之外的线程。当线程池中线程数量大于corePoolSize(核心线程池)的值进行活性检查,一旦超时便销毁线程。
- TimeUnit
- 核心线程池以外的线程存活时间的单位,
- 时间颗粒度转换
- BlockingQueue (阻塞队列)
如果线程池满了,需要将新来的访问加入到队列中 (常使用 ArrayBlockingQueue 和 LinkedBlockingQueue),一定要控制队列的数量,这样避免队列太长,导致FULL GC.- ArrayBlockingQueue : 是一个基于数组接口的有界阻塞队列, 此队列按照先进先出的原则对数组进行排序
- LinkedBlockingQueue : 一个基于链表结构的阻塞队列,此队列按照先进先出排序元素。吞吐量通常高于ArrayBlockingQueue。
- SynchronousQueue : 一个不存储元素的阻塞队列。每个插入操作必须等到两一个线程调用一处操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue。
- ThreadFactory
- 用于生成线程,一般我们使用Executors.defaultThreadFactory
- RejectedExecutionHandler
拒绝策略,当线程池(队列满,并且超过最大线程数量)已经满了,但是又有新的任务提交的时候,该采取什么策略有这个来指定- ThreadPoolExecutor.AbortPolicy : 丢弃任务并抛出RejectedExecutionException异常。
- ThreadPoolExecutor.DiscardPolicy :也是丢弃任务,但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy :丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
- ThreadPoolExecutor.CallerRunsPolicy :由调用线程处理该任务