线程池(一)

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 && 阻塞队列已满 ==> 执行拒绝策略
相关推荐
codervibe2 分钟前
使用 Spring Boot + JWT 实现多角色登录认证(附完整流程图)
java·后端
坚持学习永不言弃3 分钟前
Ehcache、Caffeine、Memcached和Redis缓存
java
大白的编程日记.12 分钟前
【计算机基础理论知识】C++篇(二)
开发语言·c++·学习
阿劲13 分钟前
从业务卡顿到数据库连接池耗尽:Spring Boot项目HikariCP超时问题实战排查
java·后端·面试
网小鱼的学习笔记15 分钟前
python中MongoDB操作实践:查询文档、批量插入文档、更新文档、删除文档
开发语言·python·mongodb
Q_Q51100828525 分钟前
python的保险业务管理与数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
亮11125 分钟前
Maven 编译过程中发生了 Java Heap Space 内存溢出(OutOfMemoryError)
java·开发语言·maven
Chef_Chen29 分钟前
从0开始学习R语言--Day40--Kruskal-Wallis检验
开发语言·学习·r语言
添乱33 分钟前
「Java案例」求PI的值
java
Zhu_S W35 分钟前
深入理解Java虚拟机:Java内存区域与内存溢出异常
java·开发语言·jvm