线程池(一)

1.线程池的基本概念

1.1 什么是线程池:

线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗。在JAVA中主要是使用ThreadPoolExecutor类来创建线程池,并且JDK中也提供了Executors工厂类来创建线程池(不推荐使用)。

1.2 线程池的优点:

降低资源消耗 ,复用已创建的线程来降低创建和销毁线程的消耗。
提高响应速度 ,任务到达时,可以不需要等待线程的创建立即执行。
提高线程的可管理性,使用线程池能够统一的分配、调优和监控。

1.3 为什么使用线程池:

在执行一个异步任务或并发任务时,往往是通过直接new Thread()方法来创建新的线程,当数据量大,需要创建的多线程,这样做弊端较多,更好的解决方案是合理地利用线程池,对多线程进行统一的管理。

1.4 线程池的种类:
java通过Executors提供四种线程池,分别为:

newCachedThreadPool

newFixedThreadPool

newScheduledThreadPool

newSingleThreadExecutor

2.线程池概述

Java中线程池的核心实现类是ThreadPoolExecutor,可以通过该类地构造方法来构造一个线程池,我们先来看下ThreadPoolExecutor的整个继承体系

Executor接口提供了将任务的执行和线程的创建以及使用解耦开来的抽象

ExecutorService接口继承了Executor接口,在Executor的基础上,增加了一些关于管理线程池本身的一些方法。

2.1 ThreadPoolExecutor的构造组成

corePoolSize ,核心线程数量,决定是否创建新的线程来处理到来的任务

maximumPoolSize ,最大线程数量,线程池中允许创建线程地最大数量

keepAliveTime ,线程空闲时存活的时间

unit ,空闲存活时间单位

workQueue ,任务队列,用于存放已提交的任务

threadFactory ,线程工厂,用于创建线程执行任务

handler,拒绝策略,当线程池处于饱和时,使用某种策略来拒绝任务提交

java 复制代码
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) 
2.2 线程池的生命周期
2.2.1 线程池五种状态

线程池的状态一共有五种,分别是RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED;

  1. RUNNING,表示可接受新任务,且可执行队列中的任务;
  2. SHUTDOWN,表示不接受新任务,但可执行队列中的任务;
  3. STOP,表示不接受新任务,且不再执行队列中的任务,且中断正在执行的任务;
  4. TIDYING,所有任务已经中止,且工作线程数量为0,最后变迁到这个状态的线程将要执行terminated()钩子方法,只会有一个线程执行这个方法;
  5. TERMINATED,中止状态,已经执行完terminated()钩子方法;
2.2.2 线程池生命周期流转

(1)新建线程池时,它的初始状态为RUNNING,这个在上面定义ctl的时候可以看到;

(2)RUNNING->SHUTDOWN,执行shutdown()方法时;

(3)RUNNING->STOP,执行shutdownNow()方法时;

(4)SHUTDOWN->STOP,执行shutdownNow()方法时;

(5)STOP->TIDYING,执行了shutdown()或者shutdownNow()后,所有任务已中止,且工作线程数量为0时,此时会执行terminated()方法;

(6)TIDYING->TERMINATED,执行完terminated()方法后;

2.3 线程池地执行流程
  1. 如果workerCount < corePoolSize ==> 创建线程执行提交的任务
  2. 如果workerCount >= corePoolSize && 阻塞队列未满 ==> 添加至阻塞队列,等待后续线程来执行提交地任务
  3. 如果workerCount >= corePoolSize && workerCount < maxinumPoolSize && 阻塞队列已满 ==> 创建非核心线程执行提交的任务
  4. 如果workerCount >= maxinumPoolSize && 阻塞队列已满 ==> 执行拒绝策略
相关推荐
CoderYanger37 分钟前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
C++业余爱好者41 分钟前
Java 提供了8种基本数据类型及封装类型介绍
java·开发语言·python
想用offer打牌43 分钟前
RocketMQ如何防止消息丢失?
java·后端·架构·开源·rocketmq
林杜雨都44 分钟前
Action和Func
开发语言·c#
皮卡龙1 小时前
Java常用的JSON
java·开发语言·spring boot·json
火山灿火山1 小时前
Qt常用控件(三)
开发语言·qt
利刃大大2 小时前
【JavaSE】十三、枚举类Enum && Lambda表达式 && 列表排序常见写法
java·开发语言·枚举·lambda·排序
float_六七2 小时前
Java反射:万能遥控器拆解编程
java·开发语言
han_hanker2 小时前
java 异常类——详解
java·开发语言
源码获取_wx:Fegn08952 小时前
基于springboot + vue健身房管理系统
java·开发语言·前端·vue.js·spring boot·后端·spring