IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 线程池详解 -> 正文阅读

[Java知识库]线程池详解

前言:线程池存在的意义

  • java面向多线程编程时,线程创建过多,容易引发内存溢出。
  • Java线程的创建、销毁和线程间切换是一件比较耗费计算机资源的。如果我们需要用多线程处理任务,并频繁的创建、销毁线程会造成计算机资源的无端浪费,因此项目中会使用是线程池技术。

线程池详解

线程池的优势

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,可能也会导致内存占用过多而产生OOM。
  • 什么是OOM
    程序申请内存过大,虚拟机无法满足我们,然后自杀了。这个现象通常出现在大图片的APP开发,或者需要用到很多图片的时候。通俗来讲就是我们的APP需要申请一块内存来存放图片的时候,系统认为我们的程序需要的内存过大,及时系统有充分的内存,比如1G,但是系统也不会分配给我们的APP,故而抛出OOM异常,程序没有捕捉异常,故而弹窗崩溃了
  • 为什么会有OOM?
    内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。(应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。)
    内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。(分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。)
  • 提供更强大的功能,延时定时线程池。

线程池的结构

在这里插入图片描述

线程池的工作原理

在这里插入图片描述

线程池生命周期

  • 首先来分析源码
    (线程池的状态)
    在这里插入图片描述
    在这里插入图片描述
状态含义说明
状态 value 说明
RUNNING当线程池创建出来的初始状态111能接受任务,能执行阻塞任务,能执行正在执行的任务
SHUTDOWN调用shutdown方法000不接受新任务,能执行阻塞任务 ,能执行正在执行的任务
STOP调用shutDownNow001不接受新任务,打断正在执行的任务,丢弃阻塞任务
TIDYING中间状态)010任务全部执行完,活动线程也没了
TERMINATED(终结状态011线程池终结

几种状态之间的转化过程

在这里插入图片描述

  • 解释含义

    • 线程池在构造前(new操作)是初始状态,一旦构造完成线程池就进入了执行状态RUNNING。

    严格意义上讲线程池构造完成后并没有线程被立即启动,只有进行“预启动”或者接收到任务的时候才会启动线程。但是线程池是出于运行状态,随时准备接受任务来执行。

    • 线程池运行中可以通过 shutdown() 和 shutdownNow() 来改变运行状态

    • 线程池Executor是异步的执行任务,因此任何时刻不能够直接获取提交的任务的状态。这些任务有可能已经完成,也有可能正在执行或者还在排队等待执行
      1.shutdown()是一个平缓的关闭过程,线程池停止接受新的任务,同时等待已经提交的任务执行完毕,包括那些进入队列还没有开始的任务,这时候线程池处于 SHUTDOWN状态;
      2.shutdownNow()是一个立即关闭过程,线程池停止接受新的任务,同时线程池取消所有执行的任务和已经进入队列但是还没有执行的任务,这时候线程池处于 STOP状态。

    • 一般情况下我们认为shutdown()或者shutdownNow()执行完毕,线程池就进入TERMINATED状态,此时线程池就结束了。其实,在shutdown/stop到TERMINATED状态之间还存在一个TIDYING状态。

具体转化状态方法

在这里插入图片描述
API
**加粗样式**

  • 状态的转化关系为

调用shundown()方法线程池的状态由 RUNNING——>SHUTDOWN

调用shutdowNow()方法线程池的状态由RUNNING——>STOP

当任务队列和线程池均为空的时候 线程池的状态由STOP/SHUTDOWN——–>TIDYING

terminated()方法被调用完成之后,线程池的状态由TIDYING———->TERMINATED状态

线程池的几个主要参数

在这里插入图片描述

参数名称翻译解释
corePoolSize核心线程池大小)核心线程池大小, 新的任务到线程池后,若线程池已创建的线程数小于corePoolSize,即便存在空闲线程,线程池会创建新的线程,直到核心线程池已满。
maximumPoolSize最大线程池大小线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。另外,对于无界队列,可忽略该参数。
keepAliveTime线程保持存活时间当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数。
unit参数的时间单位线程存活时间的单位
workQueue任务队列用于传输和保存等待执行任务的阻塞队列。
threadFactory线程工厂创建新线程。主要用于给任务线程起个自定义名字
handler线程饱和策略当线程池和队列都满了,再加入线程时会执行此策略。

Executors类提供的线程池构造方法

  • newCachedThreadPool
  • newFixedThreadPool
  • newScheduledThreadPool
  • newSingleThreadExecutor
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:17:11  更:2022-05-11 16:20:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:15:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码