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多线程5---线程优化:线程池、锁优化 -> 正文阅读

[Java知识库]Java多线程5---线程优化:线程池、锁优化

一、线程池

1、线程池优点

? (1)提前创建多个线程放在线程池,使用时直接获取,使用完放回池中待用

? ? ? ? ? ? 避免频繁创建销毁线程的内存资源消耗,实现线程的重复利用。

? (2)提高响应速度---减少了创建新线程的时间

? (3)便于线程的管理(容器思想)

2、线程池的具体实现--executorService? exexutor??

(1)通过exexutors调用newFixedThreadPool创建固定大小的线程池对象,? ? ? ? ?

? ? ? ? ? ExecutorService ?类型的对象

(2)通过该对象调用execute()方法,将要启动的线程放入线程池

(3)关闭线程池--shutdown()

//1、创建最大线程数为10的线程服务,线程池
ExecutorService  threadServices=Executor.newFixedThreadPool(10);
//2、执行,添加线程,添加线程数为当前线程池内线程数
 threadServices.execute(new MyThread());
 threadServices.execute(new MyThread());
 threadServices.execute(new MyThread());
//3、关闭连接
 threadServices.shutdown();

【注】? ??

  • 线程池启动线程的两种方式

? service.execute(new 线程)----该线程是继承runnable接口的,没有返回值

? service.submit(new 线程)-----该线程是继承Callable接口的,有返回值

  • 关闭线程池

? ?shutdown---线程池的状态设为SHUTDOWN

? ? ? ? ? ? ? ? ? ? ? ?中断没有正在执行任务的线程,不中断未完成的线程

? ?shutdownNow--线程状态改为STOP

? ? ? ? ? ? ? ? ? ? ? 尝试停止正在执行或暂停任务的线程,并返回等待执行任务列表,中断未完成的线程

3、线程池的核心参数

  • ?核心线程数--corePoolSize--目前线程池中存在的线程数(长时间稳定存活的线程数)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 线程数超过此数时,会通过线程空闲时间进行线程销毁

  • 工作队列--workQueue--请求>核心线程数部分,放入工作队列等待
  • 最大线程数--maxmumPoolSize--线程池允许的最多线程数
  • 拒绝策略--handler--当请求量>最大线程数时,拒绝请求,选择合适的拒绝策略
  • 线程空闲时间--keep AliveTime---达到某个值被销毁,避免浪费内存资源

? 当线程数<核心线程数---创建新线程

? 当请求数>工作队列数--- 创建新线程? ?

? 当请求数>核心线程数----线程进入阻塞队列

? 当线程数>核心线程数---按照线程空闲时间销毁线程

4、线程池执行过程


?每当有新的任务到线程池时,
(1) 先判断线程池中当前线程数量是否达到了corePoolSize,若未达到,则新建线程运行此任务,且任务结束后将该线程保留在线程池中,不做销毁处理,若当前线程数量已达到corePoolSize,则进入下一步;
(2) 判断工作队列(workQueue)是否已满,未满则将新的任务提交到工作队列中,满了则进入下一步;
(3) 判断线程池中的线程数量是否达到了maxumunPoolSize,如果未达到,则新建一个工作线程来执行这个任务,如果达到了则使用饱和策略来处理这个任务。

?【注】

? ? ?在线程池中的线程数量超过corePoolSize时,每当有线程的空闲时间超过了keepAliveTime,这个线程就会被终止。直到线程池中线程的数量不大于corePoolSize为止。

? ? corePoolSize:核心线程数----Java线程池中会长期保持corePoolSize个线程

? ? maximunPoolSize:线程池最大线程数

参考:Java线程池核心线程数与最大线程数的区别_July的博客-CSDN博客_核心线程数和最大线程数

5、线程池的选择策略

6、拒绝策略

待补充?

【注】线程优化的重点:选择合适的线程池,并设置合适的核心参数

? ? ? ? ? ?关注响应时间、线程性能、线程和内存使用情况等方面

二、锁优化

1、自旋锁

? ?通过忙循环形式自旋等待,而不是对线程频繁挂起


2、自适应自旋


? ? 自适应自旋意味着自旋的时间不再固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。


3、锁清除

? ? 将不可能存在共享数据竞争的锁进行消除。

4、锁粗化

? ? 如果虚拟机探测到有一系列连续操作都对同一个对象反复加锁和解锁,将会把加锁同步的范围扩展(粗化)到整个操作序列的外部。

5、锁升级

??偏向锁(无CAS)---->轻量级锁(CAS+自旋等待)----->重量级锁(CAS+阻塞队列)


此部分详见锁机制部分:(1条消息) Java多线程2---线程同步和异步、线程安全、锁机制_@snow'的博客-CSDN博客

? ?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:24:23  更:2021-09-24 10:25:42 
 
开发: 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 18:50:25-

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