线程池执行顺序
2021-09-08 20:14
85 查看
线程池参数
- corePoolSize 核心线程数,
- 最大线程数 maximumPoolSize,
- 线程没有执行任务保持多久会终止 keepAliveTime,
- 时间单位 TimeUnit unit,
- 阻塞队列 BlockingQueue workQueue
所有的任务调度都是由execute方法完成。
线程池执行顺序
- 首先检测线程池运行状态,如果不是running,则直接拒绝。
- 如果workCount < corePoolSize,则创建并启动一个线程线程来执行提交任务。
- 如果workCount >= corePoolSize,且线程池阻塞队列未满,则将任务添加到阻塞队列中。
- 如果workCount >= corePoolSize && workCount < maximumPoolSize,并且线程池内的阻塞队列已满,则创建并启动一个线程来执行新提交的任务。
- 如果workCount >= maximumPoolSize ,并且阻塞队列已满,则根据拒绝策略来处理改任务,默认是直接抛出异常
package thread; import org.junit.Test; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @Author: jeremy * @Date: * @desc: */ public class ThreadPoolTest { int corePoolSize = 3; int maximumPoolSize = 5; @Test public void test() { BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(5); ThreadPoolExecutor executor =new ThreadPoolExecutor(corePoolSize,maximumPoolSize,1L, TimeUnit.MILLISECONDS,workQueue); //执行任务,未达到核心线程数之前,创建线程 executor.execute(new TestTask()); executor.execute(new TestTask()); executor.execute(new TestTask()); //核心线程满了,阻塞队列未满,任务添加到队列中 executor.execute(new TestTask()); executor.execute(new TestTask()); executor.execute(new TestTask()); executor.execute(new TestTask()); executor.execute(new TestTask()); //阻塞队列满了,任务未达到最大线程数 executor.execute(new TestTask()); executor.execute(new TestTask()); //任务大于最大线程数,执行拒绝策略 executor.execute(new TestTask()); } } class TestTask implements Runnable{ @Override public void run() { try { TimeUnit.DAYS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } }
总结流程
核心线程数 → 添加到队列 →添加到最大线程数 → 达到最大线程数根据拒绝策略处理(抛异常或者忽略)
相关文章推荐
- 线程池在任何场景下都比顺序执行快吗??
- 线程执行顺序——CountDownLatch、CyclicBarrier 、join()、线程池
- Java线程执行顺序小结及线程池终止判定
- Java使用线程池批量顺序执行任务
- loner_li 线程池之 方法执行顺序与方法位置的先后无关
- spring线程池ThreadPoolExecutor配置并且得到任务执行的结果
- 继承关系执行顺序
- Spring线程池ThreadPoolExecutor配置并且得到任务执行的结果
- 浅谈SQL语句执行顺序分析
- 各种初始化和结束方法执行顺序
- java变量,初始化快,构造函数的执行顺序
- Java类被加载时执行的顺序问题
- sql语句的执行顺序
- Java Executor并发框架(六)Executor框架线程池任务执行全过程(上)
- SQL 中 SELECT 语句的执行顺序
- Hive中and和or的执行顺序
- 静态块、自由块及构造函数的执行顺序
- SQL Server 查询处理中的各个阶段(SQL执行顺序)
- Nginx 配置指令的执行顺序(三)
- ajax 同步执行(顺序执行)