java面试每日三题(5)线程池



一、线程池的核心参数、

线程池默认参数:

corePoolSize(核心线程数)

       1、 核心线程会一直存在,即使没有任务执行。

       2、当线程数小于核心线程数的时候,即使有空闲线程,也会一直创建线程直到达到核心线程数。

        3、设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。

queueCapacity(任务队列容量)
        也叫阻塞队列,当核心线程都在运行,此时再有任务进来,会进入任务队列,排队等待线程执行。

maxPoolSize(最大线程数)

        1、线程池里允许存在的最大容量。

        2、当任务队列已满线程数量大于等于核心线程数时,会创建新的线程执行任务。

keepAliveTime

        1、当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数等于核心线程数。

        2、如果设置了allowCoreThreadTimeout=true,则线程会退出直到线程数等于零。

allowCoreThreadTimeout(允许核心线程超时)

rejectedExecutionHandler(任务拒绝处理器)

        1、当线程数量达到最大线程数,且任务队列已满时,会拒绝任务;

        2、调用线程池shutdown()方法后,会等待执行完线程池的任务之后,再shutdown()。如果在调用了shutdown()方法和线程池真正shutdown()之间提交任务,会拒绝新任务。



二、线程池的拒绝策略

在使用线程池时,当线程数等于最大线程数而且任务队列已满时,这时候拒绝策略就会执行。

在jdk有自带的四种拒绝策略:

        1、ThreadPoolExecutor.AbortPolicy 丢弃任务,并抛出 RejectedExecutionException 异常。

        2、ThreadPoolExecutor.CallerRunsPolicy:该任务被线程池拒绝,由调用 execute方法的线程执行该任务。

        3、ThreadPoolExecutor.DiscardOldestPolicy : 抛弃队列最前面的任务,然后重新尝试执行任务。

        4、ThreadPoolExecutor.DiscardPolicy,丢弃任务,不抛出异常(相当于无声无息的丢掉了)。

因为只自带的四种拒绝策略一般不能满足我们的实际需求,所以都会自定义拒绝策略来执行。

三、线程池的执行

1、当线程数小于核心线程数时,会一直创建线程直到到达核心线程数。

2、当线程数等于核心线程数时,新加入的任务会放入任务队列等待执行。

3、当任务队列已满又有新的任务时,会创建线程直到到达最大线程数。

4、当线程数等于最大线程数且任务队列也满时,新加入任务会被拒绝。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值