用户每次调用execute()来提交一个任务,然后任务包装成Worker对象,并且启动一个worker线程来执行任务(任务可能会被先加入队列),只要任务队列不为空且worker线程没有被中断,线程的run()方法通过一个while循环,不断去队列获取任务并执行,而不会进入到run()方法底部。while循环是线程复用的关键1.2 线程池如何管理线程
---核心线程数的意义?从测试结果看,他决定了工作线程最大并发数,但未代码验证特别说明:特殊情况会创建任务为空的Worker线程来帮助队列中的任务跑完
- 线程池状态等于RUNNING状态;
- 如果任务队列已经满了,并且线程池线程数 少于 配置的线程池最大线程数(maximumPoolSize) 且小于线程池的最大支持线程数(CAPACITY)时。(如果队列没满,任务将会先加入到队列中)
---线程池状态不是RUNNING,或者往workQueue添加worker失败,这是为什么还要提交任务
- 核心线程数决定提交任务什么时候会被放入到队列中:即线程池线程数>=核心线程数时。
- 核心线程数大小跟并发执行线程(任务)无关。也就是,它不决定工作线程最大并发数
- 核心线程数可以动态修改。(如果增大了,可能会马上创建新的Worker线程)
4.4 getTask()方法
- 执行任务前先判断线程池是否是STOPING状态,是则中断worker线程。
- 执行任务:先执行firstTask,再从任务队列获取执行
- 如果没有任务,调用processWorkerExit()来执行线程退出的工作。
- 只要还有任务,worker线程就一直执行任务,并刷新completedTasks
4.5 processWorkerExit()方法
- 从workQueue中获取一个任务并返回
- 没有获取到任务就扣减线程池线程数。获取不到任务的四种情况:
- 线程池的状态是>=STOP
- 线程池的状态是SHUTDOWN并且任务队列为空
- 获取任务超时
- 线程池线程数大于maximumPoolSize并且队列为空
4.10 isShutdown()方法
- 关闭线程池,不再接受新的任务,中断已经启动的Worker线程
- 将线程池状态改为STOP
- 返回未完成的任务队列
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |