java线程池的逻辑原理

注意:经常使用线程池,那你就必须懂的其运作原理,不说刨析源码,最起码要知道思想逻辑;

第一:线程池的组成

一般的线程池由以下 4 个组成部分:

线程池管理器:创建并管理线程池
工作线程:线程池中的线程
任务接口:每个任务必须实现的接口,被工作线程调度运行,为线程任务的业务代码
任务队列:存放待处理的任务,提供一种缓冲机制,有队列可供选择
Java 中的线程池是通过 Executor 框架实现的;

在这里插入图片描述

  1. corePoolSize:设置线程池中的核心线程数量。
  2. maximumPoolSize:设置线程池中的最大线程数量。
  3. keepAliveTime:当前线程池线程数量超过 corePoolSize 时且小于maximumPoolSize的这部分线程,指这些线程空闲时的存活时间,即多少时间内会被销毁。
  4. unit:keepAliveTime 的时间单位。
  5. workQueue:任务队列,存放被提交但尚未被执行的任务。
  6. threadFactory:线程工厂,用于创建线程,一般用默认的就行,也可以自己选择设置其他。
  7. handler:拒绝策略,当任务太多,来不及处理时拒绝的逻辑。

第二:Java 线程池工作的过程(从开始到结束)

在这里插入图片描述

  1. 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。
  2. 当调用 execute() 方法添加一个任务时,线程池会做如下判断:
    a) 如果运行中的线程数量 < corePoolSize,那么马上创建线程运行这个任务;
    b) 如果运行的中线程数量 >= corePoolSize,那么将这个任务放入队列;
    c) 如果这时候队列满了,且运行中的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
    d) 如果队列满了,且运行中的线程数量大于或等于 maximumPoolSize,那么线程池
    会抛出异常 RejectExecutionException。
  3. 当一个线程完成任务时,它会从队列中取下一个任务来执行。
  4. 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。

线程复用

每一个 Thread 的类都有一个 start 方法。 当调用 start 启动线程时 Java 虚拟机会调用该类的 run
方法。 那么该类的 run() 方法中就是调用了 Runnable 对象的 run() 方法。 我们可以继承重写
Thread 类,在其 start 方法中添加不断循环调用传递过来的 Runnable 对象。 这就是线程池的实
现原理。循环方法中不断获取 Runnable 是用 Queue 实现的,在获取下一个 Runnable 之前可以
是阻塞的。

拒绝策略

线程池中的线程已经用完了,无法继续为新任务服务,同时,等待队列也已经排满了,再也
塞不下新任务了。这时候我们就需要拒绝策略机制合理的处理这个问题。
JDK 内置的拒绝策略如下:

  1. AbortPolicy : 直接抛出异常,阻止系统正常运行。
  2. CallerRunsPolicy : 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的
    任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
  3. DiscardOldestPolicy : 丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再
    次提交当前任务。
  4. DiscardPolicy : 该策略默默地丢弃无法处理的任务,不予任何处理。如果允许任务丢
    失,这是最好的一种方案。
    以上内置拒绝策略均实现了 RejectedExecutionHandler 接口,若以上策略仍无法满足实际
    需要,完全可以自己扩展 RejectedExecutionHandler 接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值