什么是线程池
线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程,便利的管理线程和任务,并将线程的创建和任务的执行解耦合开来.我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗.在JAVA中主要使用ThreadPoolExecutor类来创建线程池,并且JDK中也提供了Executors工厂类来创建线程池.
线程池的优点:
- 降低资源消耗,复用已创建的线程来降低创建和销毁线程的消耗.
- 提高响应的速度,任务到达时,可以不用等待线程的创建立即执行.
- 提高线程的可管理性,使用线程池统一的进行调度.
线程池参数
- int corePoolSize 核心线程数 一个线程池中最少包括的线程数.
- int maximumPoolSize 最大线程数 一个线程池中最多包括的线程数.
- long keepAliveTime,TimeUnit nuit 存活时间 线程池中空闲线程允许存活的最大时间.
- BlockingQueue<Runnable> workQueue 阻塞队列 线程池中有多个任务通过阻塞队列来进行管理.
- ThreadFactory threadFactory 工厂模式 通过这个工厂类来创建线程.
- RejectedExecutionHandler handler 拒绝方式 当阻塞队列满了以后如何应对新增任务.
多种拒绝方式
- ThreadPoolExecutor.AbortPolicy 直接抛出异常,所有任务全部停止.
- ThreadPoolExecutor.CallerRunsPolicy 将这个任务回退至调用者,让调用者去执行.
- ThreadPoolExecutor.DiscardOldestPolicy 丢弃最早的任务,去执行新的任务.
- ThreadPoolExecutor.DiscardPolicy 丢弃新任务.
线程池的工作流程
1.初始化线程池:创建线程池对象,设置线程池的参数,
2.提交任务:将任务提交的线程池中.
3.任务调度:线程池根据任务调度策略从任务队列中取出任务.如果线程池的线程小于核心线程数,则创建新的线程.如果线程池中的线程已经达到核心线程数且任务队列未满,则将任务放入队列中进行等待.如果线程池中的线程数小于最大线程数,且任务队列已经满了,则创建新的线程来执行任务.如果线程池中线程数量达到最大并且任务队列已经满了,则根据拒绝策略来处理任务.
4.执行任务.线程池中的线程从任务队列中取出任务,并执行任务的run()方法.
5.完成任务:任务完成后,线程会根据空闲线程存活时间来决定是否销毁多余线程.
6.关闭线程池:当不在需要使用线程池时,关闭线程池.关闭之后将不再接受新的任务提交.
通过Executor创建的线程池
1.创建一个固定线程数量的线程池.
2.创建一个线程动态变化的线程池.
3.创建一个只有一个线程的线程池
4.创建一个有定时器效果的线程池