Java中的线程池简介

线程池实现源码:

1)源码截图

2)流程示意

主要参数介绍:

1、corePoolSize :线程池中保持的最少线程数量,即使这些线程处理空闲状态,他们也不会被销毁,只有设置了allowCoreThreadTimeOut=true时才会销毁核心线程

2、maximumPoolSize :即线程池最大允许的全部线程的数量。根据上述流程图的示意,一个任务提交后,当且仅当队列已满、且线程总数没有超出maximumPoolSize的限制,则会新建一个临时线程。如果工作队列满,且线程数等于最大线程数,此时再提交任务则会调用拒绝策略

3、keepAliveTime 非核心线程空闲时存活时间,是针对当且仅当队列已满、且线程总数没有超出maximumPoolSize的限制时新建的临时线程(个人方便理解)有效的,即默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程中的线程数小于等于corepoolSIze,

4、unit : 临时线程存活时间单位,有秒、毫秒等;

5、workQueue:任务等待被执行时的保存区。常用工作队列有以下几种,包括:

        1)ArrayBlockingQueue:有界队列,需要设置大小,按FIFO排序(先进先出),新任务会被放置队尾,当线程数量已经达到maxPoolSize,则会执行拒绝策略。

        2)LinkedBlockingQueue:默认容量大小为Integer.Max_VALUE ,视为无界队列,按 FIFO 排序任务,可以设置容量(变成有界队列) 。无界情况下,参数maxPoolSize无用。创建线程池的工厂方法 Executors.newSingleThreadExecutor、Executors.newFixedThreadPool就是使用了此队列。

        3)SynchronousQueue:即没有存储队列的地方,提交任务后立即执行,无可用线程则新建,达到maxPoolSize后调用拒绝策略, Executors.newCachedThreadPool 所创建的线程池使用此队列,特点是不保存任务

        4)PriorityBlockingQueue:任务带有优先级,优先级通过参数Comparator实现。

        5) DelayQueue:无界,基于 PriorityBlockingQueue 实现,队列中每个元素都有过期时间,当从队列获取元素(元素出队)时,只有已经过期的元素才会出队,而队列头部的元素是过期最快的元素。快捷工厂方法 Executors.newScheduledThreadPool 所创建的线程池使用此队列。

:Java 中的阻塞队列(BlockingQueue)与普通队列相比,在阻塞队列为空时,会阻塞当前线程的元素获取操作,直到阻塞队列中有了元素

6、threadFactory :创建一个线程工厂用来创建线程,可以用来设定线程名、是否为daemon线程等等

7、handler 拒绝策略

        1)AbortPolicy:默认配置,丢弃任务并抛出 RejectedExecutionException 异常;

        2)DiscardPolicy:丢弃任务,但是不抛出异常;

        3)DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) 。也就是当任务被拒绝添加时,会抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务从队尾添加进去,等待执行。

        4)CallerRunsPolicy:谁调用,谁处理。由调用线程(即提交任务给线程池的线程)处理该任务,如果线程池已经被shutdown则直接丢弃;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值