美文网首页Java those things
JAVA 线程池(三)ThreadPoolExecutor 参数

JAVA 线程池(三)ThreadPoolExecutor 参数

作者: M_ENG | 来源:发表于2018-03-21 15:12 被阅读7次

    ThreadPoolExecutor的参数:

    其实理解每个参数的意思、各种类型线程池你都会创建了

    构造方法:4个构造方法

    构造方法参数说明

    corePoolSize:核心线程数

    核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会受存keepAliveTime限制。除非将allowCoreThreadTimeOut设置为true。

    maximumPoolSize:最大线程数

    线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。当任务队列为没有设置大小的LinkedBlockingDeque时,这个值无效。

    keepAliveTime:非核心线程闲置超时时间

    非核心线程的闲置超时时间,超过这个时间就会被回收。

    unit:keepAliveTime的单位

    指定keepAliveTime的单位,如TimeUnit.SECONDS。当将allowCoreThreadTimeOut设置为true时对corePoolSize生效。

    queue:任务队列

    线程池中的任务队列.

    常用的有三种队列

    SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue。

    threadFactory:线程工厂

    线程工厂,提供创建新线程的功能。ThreadFactory是一个接口,只有一个方法

    public interface ThreadFactory{ Thread newThread(Runnable r); }

    通过线程工厂可以对线程的一些属性进行定制。

    提供默认的工厂:DefaultThreadFactory

    RejectedExecutionHandler

    RejectedExecutionHandler也是一个接口,只有一个方法

    public interface RejectedExecutionHandler{

                void rejectedExecution(Runnable var1, ThreadPoolExecutor var2);

    }

    当线程池中的资源已经全部使用,添加新线程被拒绝时,会调用RejectedExecutionHandler的rejectedExecution方法。

    任务队列的使用

    (两种SynchronousQueue-LinkedBlockingDeque)

    使用:SynchronousQueue (队列大小设不设置都一样--个人理解)

    (因为不会在队列里排队、收到任务直接开启新的非核心线程)

    任务线程个数 < 核心线程数默认使用存活的核心线程

    当 任务线程个数 > 核心线程数    任务线程个数 <= 最大线程数

    会创建非核心线程、在任务完成后、闲置时间达到了超时时间就会被清除

    任务线程个数> 核心线程数    任务线程个数 > 最大线程数

    会因为线程池拒绝添加任务而抛出异常

    使用:LinkedBlockingDeque

    任务线程个数 < 核心线程数默认使用存活的核心线程

    当 任务线程个数 > 核心线程数    (在不设置队列大小的情况下)

    将任务放入LinkedBlockingDeque任务队列、等待有空闲的核心线程、执行该任务 

    任务线程个数 > 核心线程数    任务线程个数 > 最大线程数 (在设置队列大小的情况下)

    队列排队、 超出任务队列的大小、则创建新的非核心线程执行任务、超过最大线程数时抛出异常

    相关文章

      网友评论

        本文标题:JAVA 线程池(三)ThreadPoolExecutor 参数

        本文链接:https://www.haomeiwen.com/subject/viegqftx.html