线程池执行流程

ThreadPoolExecutor介绍

经过 ThreadPoolExecutor 建立线程池,API 以下所示:web

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue);

先来解释下其中的参数含义(若是看的比较模糊能够大体有个印象,后面的图是关键)。缓存

  • corePoolSize性能

    核心池的大小。在建立了线程池后,默认状况下,线程池中并无任何线程,而是等待有任务到来才建立线程去执行任务,除非调用了 prestartAllCoreThreads() 或者 prestartCoreThread() 方法,从这两个方法的名字就能够看出,是预建立线程的意思,即在没有任务到来以前就建立 corePoolSize 个线程或者一个线程。默认状况下,在建立了线程池后,线程池中的线程数为0,当有任务来以后,就会建立一个线程去执行任务,当线程池中的线程数目达到 corePoolSize 后,就会把到达的任务放到缓存队列当中。ui

  • maximumPoolSize线程

    线程池最大线程数,这个参数也是一个很是重要的参数,它表示在线程池中最多能建立多少个线程。rest

  • keepAliveTimecode

    表示线程没有任务执行时最多保持多久时间会终止。默认状况下,只有当线程池中的线程数大于 corePoolSize 时,keepAliveTime 才会起做用,直到线程池中的线程数不大于 corePoolSize,即当线程池中的线程数大于 corePoolSize 时,若是一个线程空闲的时间达到 keepAliveTime,则会终止,直到线程池中的线程数不超过 corePoolSize。可是若是调用了 allowCoreThreadTimeOut(boolean) 方法,在线程池中的线程数不大于 corePoolSize 时,keepAliveTime 参数也会起做用,直到线程池中的线程数为0。blog

  • unit
    参数 keepAliveTime 的时间单位。队列

  • workQueue
    一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,通常来讲,这里的阻塞队列有如下这几种选择:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue。资源

  • threadFactory
    线程工厂,主要用来建立线程。

  • handler
    表示当拒绝处理任务时的策略,有如下四种取值:

    ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常;

    ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,可是不抛出异常;

    ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,而后从新尝试执行任务(重复此过程);

    ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。

上面这些参数是如何配合工做的呢?请看下图:

注意图上面的序号。

简单总结下线程池之间的参数协做分为如下几步:

  1. 线程优先向 CorePool 中提交;
  2. 在 Corepool 满了以后,线程被提交到任务队列,等待线程池空闲;
  3. 在任务队列满了以后 corePool 尚未空闲,那么任务将被提交到 maxPool 中,若是 MaxPool 满了以后执行 task 拒绝策略。

线程数如何设置

其实这里主要是考察你对线程任务的理解和对系统设置时资源消耗的考虑了。由于为了保证系统的稳定性的同时,又须要尽量地资源利用最大化,提升系统性能。这就须要考虑对线程数设置的计算调整。通常来讲,线程数大小设置遵循以下规则:

最佳线程数目 =(( 线程等待时间 + 线程 CPU 时间 )/线程 CPU 时间 )* CPU 数目

可是其实这个公式也就是个参考值,通常咱们经过这个计算出大致的最佳线程数,而后经过压测再作对应的调整以找到真实的最佳线程数大小。

本文由猿必过 YBG 发布 禁止未经受权转载,违者依法追究相关法律责任 如需受权可联系:zhuyunhui@yuanbiguo.com

相关文章
相关标签/搜索