线程池:
顾名思义就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。
使用线程池的好处
- 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗
- 提高响应速度:当任务到达时,任务可以不需要等到线程创建就可以立即执行
- 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
线程池常见的参数
ThreadPoolExecutor3个最重要的参数:
- corePoolSize:任务队列未达到队列容量时,最大可以同时运行的线程数量
- maximumPoolSize:任务队列中存放的任务达到队列容量时,当前线程可以同时运行的数量变为最大线程数
- workQueue:新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。
线程池处理任务的流程
- 如果当前运行的线程数小于核心线程数,那么就会新建一个线程来执行任务
- 如果当前运行的线程数等于或大于核心线程数,但是小于最大线程数,那么就把该任务放到任务队列里等待执行
- 如果向任务队列投放任务失败(任务队列已经满了),但是当前运行的线程数是小于最大线程数的,就新建一个线程来执行任务
- 如果当前运行的线程数已经等于最大线程数了,新建线程将会使当前运行的线程超出最大线程数,那么当前任务会被拒绝