JAVA线程池以及创建线程池的七大参数


线程池的作用:

  第一:可以减少资源的消耗.  因为线程的创建和销毁比较消耗资源, 利用线程池就可以不用频繁的创建和销毁线程, 直接用, 用完也不用销毁, 重复利用, 就能达到降低资源消耗的目的. 

  第二: 方便管理. 利用线程池可以统一管理, 统一分配.

 

线程池创建:(七大参数说明)

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {

  corePoolSize :核心线程数. 代表线程池创建的常驻线程数, 这些线程创建之后一直存在. 

  maxinumPoolSize: 最大线程数, 代表能创建的最多的线程数量. 大于等于核心线程数, 这个在核心线程数不够用的情况下, 还可以增加一些临时线程, 但是总数不能超过最大线程数.

  keepAliveTime, 临时线程的空闲存活时间, 核心线程不会消除, 但是新增的临时线程空闲时间(注意是空闲时间) 超过设定的时间就需要要消除,. unit是时间单位.

  workQueue: 工作队列.  任务排队的队列, 共分为四种:

    第一种: ArrayBlockingQueue  , 基于数组, FIFO排序, 新来的放队尾, 数组是有界的, 防止资源耗尽. 

    第二种: LinkedBlockingQuene, 基于链表, FIFO拍寻, 无界. 多少线程都能放进去, 用这种队列时, maxPoolSize不起作用

    第三种:SynchronousQuene, 不缓存任务的阻塞队列,  新任务直接调度执行, 如果没有可用线程就创建, 直到maxPoolSize之后, 就执行拒绝策略

    第四种: PriorityBlockingQueue, 有优先级的无界阻塞队列.

  threadFactory : 线程工厂, 可以用来设定线程名, 是否为守护线程等特性(默认的线程名都是thread-1等字样, 分布式服务器时不易区分)

  handler:拒绝策略. 任务到达最大限制, 线程池中的线程数量也到最大限制, 再进来的新任务就只能执行拒绝策略了. jdk中有4种拒绝策略:

    第一种: CallerRunsPolicy.  直接执行新来的任务的run方法, 

    第二种: AbortPolicy, 直接丢弃新来的任务, 抛出异常: RejectedExecutionException

    第三种: DiscardPolicy, 直接丢弃新来的任务, 不抛异常.

    第四种: DiscardOldestPolicy. 丢弃队列种原有的最早的那个任务, 把新来的任务放入队列.

 线程池使用

   线程池执行任务时,

      先判断核心线程是否已满,

      如果核心线程没满, 则创建核心线程来执行任务. 

      如果核心线程已满, 则查看任务队列:

        如果任务队列没满, 就放入任务队列, 

        如果任务队列已满, 则查看是否到达最大线程数:

          如果线程总数没有达到最大线程数, 创建临时线程, 

          如果线程总数达到最大线程数, 就执行拒绝策略.

 

      简单来说就依次查看:

          核心线程   (核心线程满了)==>  任务队列,

          任务队列  (任务队列满了) ==> 创建临时线程,

          创建临时线程  (线程总数超了) ==> 执行拒绝策略

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM