线程池1.6

java线程池,首先看一下构造方法



 解释一下参数的意义

corePoolSize 核心线程数

maximumPoolSize 最大线程数,

keepAliveTime 线程中超过核心线程数的空闲线程最大存活时间

unit 存活时间的单位

workQueue 线程队列类型

Executors.defaultThreadFactory() 构造线程的工厂类

defaultHandler 超过线程队列大小的时候,默认拒绝接受线程的handler类

这几个参数的意思,等一会分析源码的时候一并解释

扫描二维码关注公众号,回复: 866526 查看本文章

提交到线程池执行的是execute方法,里面传入一个线程类



 执行超类的super.execute方法



 首先判定先有线程数是否大于核心线程数,如果不大于(小于),执行或运算后方法addIfUnderCorePoolSize方法



 再次判定当前线程数小于核心线程数,并且线程池是运行状态,执行addThread方法,将任务放进去



 首先新建一个worker,利用线程工厂创建一个线程,并将worker作为参数传入进去,看一下threadFactory.newThread方法


 这里面也就是返回的thread在运行的时候,调用传递过来的runnable接口,即是worker运行

这也就是在addThread方法后,最后调用了t的start即可

返回去,继续看execute方法的第二个if,在当前线程大于核心线程数,直接进入第二个if语句,判定runState是否是运行状态并且如队列成功

再次判定,是否线程池已经不执行了,或者当前线程数等于0,则执行ensureQueuedTaskHandled,该方法

只要不在运行中或者入队列失败,则执行addIfUnderMaximumPoolSize方法



 该方法和addIfUnderCorePoolSize方法类似,判定当前线程小于最大线程数并且线程池运行状态,然后进行addThread操作

如果这个时候,还是没有入队列成功,则执行reject来拒绝任务

回到addThread方法,该方法最后执行了t.start方法,这个t是threadFactory.newThread(w)产生的,该方法又执行了w也就是worker的run方法,

worker的run方法



 用getTask来获取队列中的商品

则执行第二个if,判定线程状态是否是执行状态

猜你喜欢

转载自lovewen-2004.iteye.com/blog/2422883