040 线程池

文章目录


项目开发中,不会使用之前3种线程的实现方式,因为之前3种线程实现方式无法控制线程,可能会造成系统资源耗尽,浪费系统资源,造成系统性能下降;

在企业业务开发中,必须使用线程池的方式,构建多线程;让线程充分利用,降低系统的资源的消耗。

问题:为什么要使用线程池???(池化技术)

我们需要执行一个java任务,可以直接new Thread 来运行任务,线程从创建到销毁经历哪些过程???

1.创建java线程实例,线程是一个对象实例,堆内存中分配内存(创建线程需要消耗时间和内存)

2.执行start方式启动线程,操作系统为Java线程创建对应的内核线程,线程处于就绪状态(内核线程是操作系统的资源,创建需要时间和内存)

3.线程被操作系统cpu调度器选中后,线程开始执行(run方法开始运行)

4.JVM开始为线程创建线程私有资源:JVM虚拟机栈*程序计数器(需要时间和内存)

5.线程运行过程中,cpu上下文切换(消耗时间,频繁切换,影响性能)

6.线程运行完毕,Java线程被垃圾回收器回收(销毁线程内存需要时间)

从线程执行的流程来看:

1.线程不仅是java对象,更是操作系统的资源(创建线程,消耗线程都需要时间)

2.Java线程的创建和运行都需要内存空间(线程数量太多,消耗很多内存)

3.cpu上下文切换(线程数量一大,cpu频繁切换)

线程池优势:

1.降低系统的资源的消耗

2.提高系统的响应速度

3.方便管理(线程复用,控制最大并发数,管理线程)

事先准备好一些资源,有人要用(业务系统要是有线程),就来我这里拿(线程池中获取),用完之后不能销毁,必须还给我(线程池线程可复用性)

package com.xd.cubemall.juc;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;@Slf4j
public class ThreadPoolDemo {public static void main(String[] args) {// 1.创建线程池对象;创建单个线程的线程池对象ExecutorService executorService = Executors.newSingleThreadExecutor();//2.创建固定数量的线程池(指定核心线程数数量),核心线程数为2ExecutorService executorService2 = Executors.newFixedThreadPool(2);//3.创建一个按照计划执行的线程池ScheduledExecutorService executorService3 = Executors.newScheduledThreadPool(2);//4. 创建一个自动增长的线程池ExecutorService executorService4 = Executors.newCachedThreadPool();// 线程执行try {for (int i = 0; i < 10; i++) {executorService4.execute(()->{log.info("Executors创建线程池的方式实现多线程......");//业务代码执行int j = 100/3;log.info("业务代码执行结果:{}",j);});}} catch (Exception e) {e.printStackTrace();} finally {//线程池用完,关闭线程池executorService4.shutdown();}}
}

参数解析:

1.corePoolSize:线程池核心线程数,初始化线程池时候,会创建核心线程等待状态,核心线程不会被摧毁,提供线程的复用;

2.maximumPoolSize:最大线程数;核心线程用完了,必须新建线程执行任务,但是新建的线程不能超过最大线程数;

3.keepAliveTime: 线程存活时间,除了核心线程以外(maxinumPoolSize-corePoolSize)的线程存活时间;当线程处于空闲状态,他可以活多久;

4.unit:存活时间单位

5.workQueue:任务阻塞队列,任务可能会很多,线程就那么几个,因此可以把多余的任务放入队列进行缓冲,队列采用FIFO的,等待线程空闲,再从队列取出任务执行;

不建议使用以上的创建线程池的方式:
​ 原因是以上的线程池创建的方式,当线程量一大后,可能造成无限制创建线程,从而导致内存被占满,线程量大导致性能严重下降,甚至OOM;

解决方案:

​ 使用ThreadPoolExecutor类创建线程池;

        //  可伸缩ThreadPoolExecutor threadPool = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),9,3,TimeUnit.SECONDS,new LinkedBlockingDeque<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {}

threadFactory: 线程工厂,默认使用defaultthreadFactory,用来创建线程的,一般使用默认即可;

RejectedExecutionHandler: 线程池拒绝策略

四种拒绝策略:

1.new ThreadPoolExecutor.AbortPolicy():新任务直接被拒绝,抛出异常:RejectedExecutionException;

2.DisCardPolicy:队列满了,新任务忽略不执行,直接丢弃,不会抛出异常

3.DisCardOldestPolicy:队列满了,新任务尝试和等待最久的线程竞争,也不会抛出异常;抛弃任务队列中等待最久任务,新任务直接添加到队列中

4.CallerRunPolicy:新任务来临后,直接使用调用者所在线程执行任务即可

合理配置线程相关的参数:核心线程数,最大线程数
设置线程池线程数的数量:根据业务类型进行设置(cpu密集型,io密集型)
如果是CPU密集型任务(所有任务都在内存中执行:没有磁盘的读写);建议线程池最大数量设置为N(cpu核心数量)+1
如果是IO密集型任务(大量磁盘读写任务):如果有IO操作,cpu此时处于空闲状态,最大线程数应该设置:2N+1
最大线程数设置公式:
最大线程数 = (任务执行时间/任务cpu时间)*N

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/470501.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gdb编译教程(支持linux下X86和ARM架构)

1、下载源码 http://ftp.gnu.org/gnu/gdb/ 我下载的8.2版本。 2、下载完后拷贝到linux的x86系统。 3、解压&#xff0c;然后进入到目录下&#xff0c;打开当前目录的命令行窗口。 4、创建一个生成目录。 5、我们先开始x86版本&#xff0c;这个比较简单&#xff0c;不需要配置…

10款翻译工具实践体验感受与解析!!!!!

在现今的数字化时代&#xff0c;翻译工具如同语言的桥梁&#xff0c;为我们打开了通向世界的大门。今天咱们不聊别的&#xff0c;就聊聊那些让我又爱不释手的翻译工具们。因为我的职业因素&#xff0c;作为一个经常需要跟各种语言打交道的“文字搬运工”&#xff0c;这些工具可…

【日志】392.判断子序列

2024.11.8 【力扣刷题】 392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/is-subsequence/?envTypestudy-plan-v2&envIdtop-interview-150 整个题从一开始就是打算从双指针的思想往下走的。但是&#xff0c;我设置了四个变量sLeft…

C++20 中最优雅的那个小特性 - Ranges

C20 中最优雅的那个小特性 - Ranges 大家好&#xff0c;今天我们来聊聊 C20 的一项非常重要的新特性——Ranges&#xff0c;可以让你的代码更优雅、更高效、更炫酷&#xff0c;如果你是一个对代码有所追求的小伙伴&#xff0c;那么这个特性你绝对值得拥有&#xff01; 啥是 …

Python多进程间通讯(包含共享内存方式)

文章目录 1 通过非共享内存配合队列方式2 通过共享内存配合队列方式 注&#xff1a;本博文测试环境为Linux系统。 1 通过非共享内存配合队列方式 下面是一个常见的生产者与消费者的模式示例&#xff0c;这里分别启动了两个子进程&#xff0c;一个为生产者&#xff08;producer…

深入理解接口测试:实用指南与最佳实践5.0(一)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

2024.11.12_大数据的诞生以及解决的问题

大数据的诞生以及解决的问题 视频一&#xff1a;大数据诞生的背景原因&#xff1a;传统的数据处理架构无法满足海量的数据存储和计算需求 视频三&#xff1a;区分离线处理场景和实时处理场景视频五&#xff1a;传统的大数据与现代的大数据区别&#xff08;离线场景&#xff09;…

ML 系列: 第 24 节 — 离散概率分布(泊松分布)

目录 一、说明 二、固定时间间隔示例 三、固定间隔的示例 四、泊松分布的主要特征 五、示例 5.1 平均客户数的计算&#xff1a; 5.2 用于计算和绘制泊松分布的 Python 代码&#xff1a; 一、说明 泊松概率分布是一种离散概率分布&#xff0c;它表示在固定的时间或空间间隔内发生…

闯关leetcode——3174. Clear Digits

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/clear-digits/description/ 内容 You are given a string s. Your task is to remove all digits by doing this operation repeatedly: Delete the first digit and the closest non-digit cha…

机器情绪及抑郁症算法

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月12日17点02分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17230869054974 计算机来理解你的情绪&a…

【深圳大学】数据结构A+攻略(计软版)

1. 考试 1.1 形式 分为平时&#xff0c;笔试&#xff0c;机试三部分。其中&#xff1a; 平时占30%&#xff0c;包含平时OJ测验和课堂练习&#xff0c;注意这个可能会因老师的不同和课题组的新策略而改变。笔试占60%&#xff0c;是分值占比的主要部分。机试占10%。 1.2 题型…

Chrome使用IE内核

Chrome使用IE内核 1.下载扩展程序IE Tab 2.将下载好的IE Tab扩展程序拖拽到扩展程序界面&#xff0c;之后重启chrome浏览器即可

使用pytest+openpyxl做接口自动化遇到的问题

最近使用pytestopenpyxl做了个接口自动化的小项目&#xff0c;遇到了一些问题。 首先&#xff0c;使用pytest这个框架&#xff0c;主要是使用了pytest.fixture, pytest.mark.parametrize这两个fixture去做参数化&#xff0c;里面注入的数据是用openpyxl来实现的。 接口介绍&a…

IEC60870-5-104 协议源码架构详细分析

IEC60870-5-104 协议源码架构 前言一、资源三、目录层级一二、目录层级二config/lib60870_config.hdependencies/READMEexamplesCMakeLists.txtcs101_master_balancedcs104_client_asyncmulti_client_servertls_clienttls_server说明 make这些文件的作用是否需要导入这些文件&a…

TensorRT基础知识

github:https://github.com/NVIDIA/TensorRT 官网快速入门链接&#xff1a;Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation 引言&#xff1a; TensorRT 是 NVIDIA 推出的一个高性能深度学习推理库&#xff0c;专门用于优化和加速已经训练好的深度学习模型…

jenkins提交gitee后自动部署

jenkins中安装gitee插件 Gitee Plugin​​​​​​ 配置gitee WebHook 生成giteeHook密码 去gitee中配置webHook 输入jenkins中的url和生成的密码 当我们再提交后就可以自动部署 gitee官方配置

软件测试面试八股文(超详细整理)

请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 32…

【金融风控】特征评估与筛选详解

内容介绍 掌握单特征分析的衡量指标 知道 IV&#xff0c;PSI等指标含义 知道多特征筛选的常用方法 掌握Boruta,VIF,RFE,L1等特征筛选的使用方法 【理解】单特征分析 什么是好特征 从几个角度衡量&#xff1a;覆盖度&#xff0c;区分度&#xff0c;相关性&#xff0c;稳定…

链游系统定制化开发:引领游戏产业的新时代

在数字革命的浪潮中&#xff0c;链游&#xff08;区块链游戏&#xff09;作为一种新兴游戏形式&#xff0c;正重新定义游戏产业的发展方向。链游将区块链技术与传统游戏结合&#xff0c;使游戏体验更加公平透明&#xff0c;并赋予玩家真正的资产所有权。这一领域不仅为玩家带来…

2024 年 8 个最佳 API 设计工具图文介绍

8 个最佳 API 设计工具推荐&#xff0c;包括 Apifox、Postman、Swagger、Insomnia、Stoplight、Hoppscotch、RapidAPI和Paw。 详细介绍&#xff1a;2024 年 8 个最佳 API 设计工具推荐