java线程池 开源_java线程池——ThreadPoolExecutor源码解析

在Java中,我们经常使用的线程池就是ThreadPoolExecutor,此外还有定时的线程池ScheduledExecutorService(),但是需要注意的是Executors.newCachedThreadPool()的线程是没有上届的,在使用时,需要注意,因为没有办法控制线程数量,可能会导致线程的溢出。

一个简单的示例

ded585b69749c64ce4bc0fc16e5e27d6.png

1 ThreadPoolExecutor提供了四个构造函数:

//五个参数的构造函数

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue)

//六个参数的构造函数

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory)

//六个参数的构造函数

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

RejectedExecutionHandler handler)

//七个参数的构造函数

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler)

2 各个参数解释

int corePoolSize:该线程池中核心线程数最大值。

核心线程:线程池新建线程的时候,如果当前线程总数小于corePoolSize,则新建的是核心线程,如果超过corePoolSize,则新建的线程即为非核心线程,核心线程默认情况下会一直存在线程池中,即使这个线程什么也不干,如果指定ThreadPoolExecutor的allowCoreThreadTimeOut这个属性是true,那么核心线程如果长时间不干活的话,超过一定时间,就会被销毁掉。

int maximumPoolSize:该线程池中线程的最大值

long keepAliveTime :该线程池中非核心线程闲置超时时间

一个非核心线程,如果不干活的时间超过这个参数所设定的时长,就会被销毁,如果设置allowCoreThreadTimeOut = true,那么核心线程超过所设定的时长,那么也会销毁掉。

TimeUnit unit:keepAliveTime的单位

TimeUnit是一个枚举类型,其包括:NANOSECONDS : 1微毫秒 = 1微秒 / 1000,MICROSECONDS : 1微秒 = 1毫秒 / 1000,MILLISECONDS : 1毫秒 = 1秒 /1000,

SECONDS : 秒,MINUTES : 分,HOURS : 小时,DAYS : 天。

BlockingQueue workQueue:该线程池中的任务队列:维护等待执行的Runnable对象。

如果当所有的核心线程都在干活时,新添加的任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心的线程执行任务。常用的workQueue类型。

SynchronousQueue:这个队列接收到任务的时候,会直接提交给线程处理,而不会保留它,如果线程都在工作,那就新建一个线程来处理这个任务,所以为了保证不出现的错误,使用这个类型队列的时候,maximumPoolSize一般指定成Integer.MAX_VALUE,即无限大。

LinkedBlockingQueue:这个队列接收到任务的时候,如果线程小于核心线程,则新建核心线程来处理任务,如果当前线程等于核心线程数,则进入队列中等待。由于这个队列没有最大值限制,即所有超过核心线程数的任务都会被添加到队列中去,这也导致maximumPoolSize的设定失效,因为总线程数永远不会超过corePoolSize

ArrayBlockingQueue:可以设定队列的长度,接收到任务的时候,如果没有达到corePoolSize的值,则新建线程执行任务,如果达到了,则入队等候,如果队列已满,则新建线程执行任务,如果线程数到了maximumPoolSize,并且队列中也满了,则发生错误。

DelayQueue:队列中元素必须实现Delayed接口,这就意味着你传进去的任务必须实现

Delayed接口,这个队列接收到任务时,首先先入队,只有达到指定的延时时间,才会执行任务。

ThreadFactory threadFactory:创建线程的方式,这是一个接口,你new它的时候需要实现它的Thread newThread(Runnable r)方法,一般用不上。

RejectedExecutionHandler handler:这玩意儿就是抛出异常专用的,比如上面提到的两个错误发生了,就会由这个handler抛出异常,根本用不上。

3 常用API解释:

public void execute(Runnable command)

将来某个时候执行给定的任务。任务可以在新线程中执行,也可以在现有的池线程中执行。如果无法提交任务以供执行,或者因为该执行器已经关闭,或者因为其容量已经达到,则该任务由当前{RejectedExecutionHandler}处理。

public void shutdown()

将线程池状态置为SHUTDOWN,并不会立即停止,停止接收外部submit的任务,内部正在跑的任务和队列里等待的任务,会执行完,才真正停止。

public List shutdownNow()

将线程池状态置为STOP。企图立即停止,事实上不一定,跟shutdown()一样,先停止接收外部提交的任务,忽略队列里等待的任务,尝试将正在跑的任务interrupt中断,返回未执行的任务列表。

public boolean awaitTermination(long timeout, TimeUnit unit)

当前线程阻塞,直到等所有已提交的任务(包括正在跑的和队列中等待的)执行完,或者等超时时间到,或者线程被中断,抛出InterruptedException,然后返回true(shutdown请求后所有任务执行完毕)或false(已超时)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值