线程池--参数和工作流程

ThreadPoolExecutor构造函数如下

线程池的参数

 

(1)corePoolSize

corePoolSize 指的是核心线程数,线程池初始化时线程数默认为 0,当有新的任务提交后,会创建新线程执行任务,如果不做特殊设置,此后线程数通常不会再小于 corePoolSize ,因为它们是核心线程,即便未来可能没有可执行的任务也不会被销毁。需要注意,此值如果设置的比较小,则会频繁的创建和销毁线程;如果设置的比较大,则会浪费系统资源,所以开发者需要根据自己的实际业务来调整此值。

(2)maximumPoolSize

maximumPoolSize,最大线程数,表示线程池最大可以创建的线程数。当达到核心线程数后,同时任务队列满了之后,线程池会进一步创建新线程,最多可以达到 maximumPoolSize 来应对任务多的场景。

(3)keepAliveTime + 时间单位unit

keepAliveTime,当线程池中线程数量多于核心线程数时,而此时又没有任务可做,线程池就会检测线程的 keepAliveTime,如果超过规定的时间,无事可做的线程就会被销毁,以便减少内存的占用和资源消耗。如果后期任务又多了起来,线程池也会根据规则重新创建线程,所以这是一个可伸缩的过程,比较灵活,我们也可以用 setKeepAliveTime 方法动态改变 keepAliveTime 的参数值。

时间单位unit ,表示存活时间的单位,它是配合 keepAliveTime 参数共同使用的。

(4)ThreadFactory

ThreadFactory 实际上是一个线程工厂,它的作用是生产线程以便执行任务。我们可以选择使用默认的线程工厂,创建的线程都会在同一个线程组,并拥有一样的优先级,且都不是守护线程,我们也可以选择自己定制线程工厂,以方便给线程自定义命名,不同的线程池内的线程通常会根据具体业务来定制不同的线程名。

(5)workQueue

workQueue表示线程池执行的任务队列,随着任务的不断增加,线程数会逐渐增加并达到核心线程数,此时如果仍有任务被不断提交,就会被放入 workQueue 任务队列中。

(6)handler

handler,表示指定线程池的拒绝策略,当线程池的任务已经在缓存队列workQueue中存储满了之后,并且不能创建新的线程来执行此任务时(达到最大线程数maximumPoolSize后 ),就会使用使用拒绝策略,它属于一种限流保护的机制。

线程池的工作流程?

execute()源码

线程池的工作流程要从它的执行方法 execute() 说起,源码如下:

其中 addWorker(Runnable firstTask, boolean core) 方法的参数说明如下:

(1)    firstTask,线程应首先运行的任务,如果没有则可以设置为 null。

(2)    core,判断是否可以创建线程的阀值(最大值),如果等于 true 则表示使用 corePoolSize 作为阀值,false 则表示使用 maximumPoolSize 作为阀值。

线程池任务执行的主要流程

如上图所示,当提交任务后,线程池首先会检查当前线程数,如果此时线程数小于核心线程数,比如最开始线程数量为 0,则新建线程并执行任务,随着任务的不断增加,线程数会逐渐增加并达到核心线程数,此时如果仍有任务被不断提交,就会被放入 workQueue 任务队列中,等待核心线程执行完当前任务后重新从 workQueue 中提取正在等待被执行的任务。

此时,假设我们的任务特别的多,已经达到了 workQueue 的容量上限,这时线程池会在 corePoolSize 核心线程数的基础上继续创建线程来执行任务直到线程数达到 maximumPoolSize 最大线程数,如果依然有任务被提交,这就超过了线程池的最大处理能力,这个时候线程池就会使用拒绝策略来拒绝这些任务。随着队列中任务被执行完,这时线程池就会检测线程的 keepAliveTime,如果超过规定的时间,大于核心线程数corePoolSize 的线程会被合理回收,以便减少内存的占用和资源消耗。

submit() 和 execute()方法有什么区别?(ThreadPoolExecutor 的执行方法有几种?)

execute() 和 submit() 都是用来执行线程池任务的,它们最主要的区别是,submit() 方法可以接收线程池执行的返回值,而 execute() 不能接收返回值。

submit()方法可以配合Futrue来接收线程执行的返回值。它们的另一个区别是execute()方法属于Executor接口的方法,而 submit() 方法则是属于 ExecutorService 接口的方法,它们的继承关系如下图所示:

posted @ 2020-04-16 16:25  JustJavaIt  阅读(430)  评论(0编辑  收藏  举报