ThreadPoolExecutor基本原理

概述

ThreadPoolExecutorJava中最基本的线程池实现,Executors类的工厂方法newFixedThreadPool()newCachedThreadPool()newSingleThreadPool()等,内部都是用ThreadPoolExecutor实现的。


内部类Worker

线程池中实际执行任务的基本工作单元。

基本成员

  • Thread thread:供Worker运行的线程,也即线程池的工作线程。
  • Runnable firstTask:初始化Worker类时传入的Runnable对象。

构造Worker对象时,需要传入firstTask,也就是这个Worker将要运行的第一个Runnable。同时构造函数中会为Worker生成一个新的线程。

工作循环

线程池比一般的线程高级的地方在于,它实现了线程复用,同一个线程执行完一个任务后可以继续执行下一个任务,而一般的线程在执行完后就废弃了,因为Thread.start()方法只能调用一次。

线程池中的线程复用是由工作循环实现的,Worker类实现了Runnable接口,它的run()方法就是一个无限循环,负责不断地获得并执行任务。

因为构造Worker类时传入了firstTask,所以第一次循环会执行firstTask,此后的循环,则会从workerQueue中取出Runnable执行。


线程管理

与线程管理有关的属性:

  • int corePoolSize:核心线程数
  • int maxPoolSize:最大线程数
  • BlockingQueue workerQueue:等待队列

线程产生

当调用ThreadPoolExecutor.execute(Runnable runnable)方法提交新任务时,会按照以下步骤处理:

  1. 如果现有线程数量小于corePoolSize,则新建一个Worker对象,传入的Runnable即为该WorkerfirstTask,并使得Worker对于的Thread开始运行。
  2. 如果该Runnable可以放入workerQueue,则放入workerQueue
  3. 如果workerQueue已满,则判断当前线程数是否小于maxPoolSize,若满足,则新建一个Worker对象运行传入的Runnable,若不满足,则rejectRunnable

线程销毁

当某个Worker执行完一个Runnable,从workerQueue中获取新任务时,如果在给定的阻塞时间内获取不到任务,且当前线程数量大于corePoolSize,则该Worker关闭。通俗的说,只有当任务很多时,线程数量才会超过corePoolSize,比较空闲的时候,线程数量会保持在corePoolSize

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值