Java线程池知识点总结

news2024/12/22 18:58:50

1、线程池优势:

  1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  2. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  3. 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

2、线程池的七个参数:

  1. 核心线程数量——在线程池当中无论空闲多久都不会被删除的线程
  2. 线程池当中最大的线程数量——线程池当中最大能创建的线程数量
  3. 空闲时间(数值)——临时线程(线程池中出核心线程之外的线程)空闲了多久就会被淘汰的时间。
  4. 空闲时间(单位)——临时线程空闲了多久就会被淘汰的时间单位,要用枚举类TimeUnit类作为参数
  5. 阻塞队列——就是创建一个阻塞队列作为参数传入,就是当线程池当中线程数量已经达到了最大线程数量,允许多少个任务排队获取线程,其余的用参数七那个方案来处理。
  6. 线程工程——不是new一个线程,而是传入一个线程工厂(例如:Executors工具类中的defaultThreadFactory方法返回的就是一个线程工厂)
  7. 拒绝策略——当等待队列中也排满时要怎么处理这些任务。

3、拒绝策略

//代码实现
   /**
     * 之前用工具类进行创建,有好多参数不能自己设置
     * 咱直接自己手动创建一个线程池,自己设置参数
     * 参数一:核心线程数量                           不能小于0
     * 参数二:最大线程数                             不能小于0,数值大于等于核心线程数量
     * 参数三:空闲临时线程最大存活时间(数值)           不能小于0
     * 参数四:空闲临时线程最大存活时间(单位)            用TimeUnit这个枚举类表示
     * 参数五:任务队列,也就是一个堵塞队列               不能为null
     * 参数六:创建线程的工厂                            不能为null
     * 参数七:任务的拒绝策略                             不能为null
     */
 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
        3,  // 核心线程数量
        6,              //最大线程数
        60,             //空闲临时线程最大存活时间(数值)
        TimeUnit.SECONDS,//空闲临时线程最大存活时间(单位)
        new ArrayBlockingQueue<>(3),//任务队列,也就是一个堵塞队列,也可以使用LinkedBlockingQueue这个阻塞队列
        Executors.defaultThreadFactory(),//用线程池工具类Executors创建线程的工厂
        new ThreadPoolExecutor.AbortPolicy()//任务的拒绝策略中其中一个,丢弃任务并抛出RejectedExecutionException
    );
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    threadPoolExecutor.submit(loopTread);
    }

上面的代码我们设置最大线程数量为6,而阻塞队列可以排三个,说明当同时有超过9个任务需要执行,第10个线程就会执行拒绝策略,我设置的策略为丢弃任务,并抛出异常RejectedExecutionException。下面有结果就可以证明我们的猜测。

 74行恰好是我们放入线程池中第10个任务,所以第74行抛出了RejectedExecutionException异常。

4、线程池的执行流程

  • 当核心线程满时,再提交队伍就会在阻塞队列中排队
  • 当核心线程满了,阻塞队列中也满了,才会创建临时线程
  • 当核心线程满了,阻塞队列满了,临时线程也满了,会触发任务拒绝策略,也就是参数七

5、四种已实现的线程池

5.1 CachedThreadPool(缓存线程池)
  • 特点:
    • 核心线程数为0,最大线程数为无限大,意味着线程数量可以无限增加。
    • 任务队列使用 SynchronousQueue,这是一个没有存储空间的阻塞队列。
    • 线程空闲时间超过60秒就会被销毁。
  • 适用场景
    • 适用于执行大量短时间的任务,但要注意,如果任务执行时间过长,会导致线程池中的线程数量增加,占用更多内存。
5.2 FixedThreadPool(固定线程池)
  • 特点:
    • 固定大小:线程池中的线程数量不会改变。
    • 使用无界的阻塞队列来存放任务,确保任务按照提交顺序执行。
    • 当需要执行一个任务时,FixedThreadPool会检查是否有空闲线程可用。
    • 如果有,就将任务交给空闲线程执行。
    • 如果没有空闲线程,就会将任务放入任务队列中等待执行。
  • 适用场景:
    • 限制并发线程数的场景,例如服务器资源有限、数据量较小或不可控的情况。
    • 确保任务按照提交的顺序执行。
5.3 ScheduledThreadPool(定时调度线程池)
  •  是一个用于执行定时任务的线程池。
  • 它可以在一定延迟之后执行任务,或者周期性地执行任务。
  • 只执行一次某个任务:在一定延迟之后执行一次指定的任务。
  • 周期性执行某个任务:在一定延迟之后开始周期性地执行任务,执行周期间隔由指定的时间决定

5.4 SingleThreadExecutor(单个线程池)
  • 特点
    • 只有一个核心线程,提交的任务会依次执行,一个一个地排队执行。
    • 线程池中的线程可以被复用,减少了线程创建和销毁的开销。
  • 应用场景
    • 顺序执行任务:需要按照提交顺序执行任务的场景。
    • 避免线程同步问题:它避免了使用 synchronized 来保证线程同步的复杂性。
    • 资源管理:线程池中的线程可以被复用,减少了频繁创建和销毁线程的开销。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity MVC开发模式与开发流程详解

在Unity游戏开发中&#xff0c;采用MVC&#xff08;Model-View-Controller&#xff09;模式是一种非常常见的设计模式。MVC模式将应用程序分为三个部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#x…

Linux网络编程(三-UDP协议)

目录 一、UDP概述 二、UDP的首部格式 三、UDP缓冲区 四、基于UDP的应用层协议 五、常见问题 一、UDP概述 UDP(User Datagram Protocol&#xff0c;用户数据协议报)是传输层协议&#xff0c;提供不可靠服务&#xff0c;其特点包括&#xff1a; 无连接&#xff1a;知道对端…

手把手教你如何搭建性能测试环境

前言 在进行性能则试前&#xff0c;需要完成性能测试的搭建工作&#xff0c;一般包括硬件环境、软件环境及网络环境&#xff0c;可以要求配置和开发工程师协助完成&#xff0c;但是作为一个优秀性能测试工程师&#xff0c;这也是你的必备技能之一。 性能测试环境与功能测试环…

Apipost多host服务配置如何使用

最近Apipost新增同环境下多host服务的配置功能&#xff0c;本篇文章带来该功能的使用场景及使用方法。 配置方法&#xff1a; 点击右上角眼睛标识进入环境管理 点击添加服务&#xff0c;输入服务名和URL 配置完成后需要在接口目录中选择该目录下需要使用的host服务&#xff0…

w29pikachu-ssrf实例

SSRF简介 SSRF是服务器端请求伪造 危害&#xff1a; 1.可以对服务器所在内网、本地进行端口扫描&#xff0c;获取一些服务的信息等 2.目标网站本地敏感数据的读取 3.内外网主机应用程序漏洞的利用 4.内外网web站点漏洞的利用 ssrf常用的相关协议&#xff1a; gopher://: 发…

IDEA实现ssh远程连接本地Linux服务器

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

2024.2.21 C++QT 作业

思维导图 练习题 1>使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数&#xff0c;将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"…

C语言----字符数组指针

1.char arr[] {a,b,c,d,e,f}; sizeof分析类型就可以计算所占的内存空间的大小&#xff1b; &#xff08;1&#xff09;printf("%d\n", sizeof(arr)); 数组名单独放进里面&#xff0c;计算整个数组大小&#xff0c;所以是6字节&#xff1b; &#xff08;2&#xff…

微信小程序 ---- 慕尚花坊 项目初始化

目录 项目介绍 01. 项目概述 02. 项目演示 03. 项目技术栈 04. 接口文档 申请开发权限 项目初始化 01. 创建项目与项目初始化 02. 自定义构建 npm 集成Sass 03. 集成项目页面文件 04. VsCode 开发小程序项目 项目介绍 01. 项目概述 [慕尚花坊] 是一款 同城鲜花订购…

JAVA设计模式结构型模式

一、前言 java设计模式主要分为创建型模式&#xff0c;结构型模式和行为型模式。上一篇主要总结了行为型设计模式&#xff0c;本章总结&#xff0c;结构型模式。像创建型模式就不写了&#xff0c;比较简单。大概知道是工厂模式和建造者模式&#xff0c;原型模式就行&#xff0…

相机图像质量研究(39)常见问题总结:编解码对成像的影响--运动模糊

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

新火种AI|估值180亿!月之暗面成为AI领域又一独角兽...

作者&#xff1a;小岩 编辑&#xff1a;彩云 2月20日&#xff0c;AI领域内的初创企业月之暗面完成了全新一轮的融资&#xff0c;金额超过10亿美元&#xff0c;一举刷新国内AI领域最大单笔融资记录。据悉&#xff0c;为月之暗面进行投资的资本方众多&#xff0c;包括红杉中国&…

vue保留用户在列表的操作记录, beforeRouteLeave离开当前组件缓存数据即可

最近遇到一个需求,用户在列表页的查询输入框输入条件后,点击查询,然后此时切换菜单,再回到之前的页面,希望能停留在上一次输入的结果上,如下例子,用户管理页面,输入yangfan这个关键词搜索后,结果如下图: 当我此时点击权限管理后,再点击用户管理切回来,结果依旧如上…

【论文阅读|基于 YOLO 的红外小目标检测的逆向范例】

基于 YOLO 的红外小目标检测的逆向范例 摘要1 引言2 相关工作2.1 逆向推理2.2 物体检测方法 3 方法3.1 总体架构3.2 逆向标准的可微分积分 4 实验4.1 数据集和指标4.2 实验环境4.4 OL-NFA 为少样本环境带来稳健性 5 结论 论文题目&#xff1a; A Contrario Paradigm for YOLO-b…

2024年2月中国数据库排行榜:PolarDB夺魁首登顶,TiDB攀升回探花

银装素裹覆大地&#xff0c;春意初醒待来临。2024年2月墨天轮中国数据库流行度榜单出炉&#xff0c;表现最亮眼的无疑是PolarDB&#xff0c;其自23年7月以来一路高歌猛进&#xff0c;此次更是一举夺魁&#xff0c;彰显了云原生数据库的蓬勃发展态势&#xff0c;OceanBase、TiDB…

笔试题详解(C语言进阶)

前言 欢迎阅读本篇文章&#xff01;本篇文章通过一个笔试题来加强我们对C语言的理解&#xff0c;希望对你有帮助。后续我会写一个栏目&#xff0c;集合我见到的C语言题目&#xff0c;进行分析讲解。 1、题目一 判断下面程序的输出结果&#xff1a;(下面说的地址4/8字节是因为对…

使用Outlook邮箱保护您的隐私

在数字时代&#xff0c;我们的电子邮件地址就像是我们的数字身份证&#xff0c;它连接着我们的个人信息和网络世界。无论是注册新服务、购物还是预订餐桌&#xff0c;电子邮件地址都是我们身份的关键部分。然而&#xff0c;这也使我们容易受到垃圾邮件和隐私泄露的影响。但是&a…

基于ImageSharp实现趣味横生的点选验证

引言 随着安全需求的不断提升&#xff0c;传统的文本验证码已经无法满足防止机器自动识别和攻击的要求。点选式验证码作为一种交互式的验证手段&#xff0c;因其更难被自动化脚本破解而逐渐受到欢迎。利用开源图像处理库SixLabors.ImageSharp来实现点选式验证码功能。 ImageS…

将从excel 文件里获取的时间转换成标准时间

new Date(new Date(1900, 0, data.PostingDate).setDate(new Date(1900, 0, data.PostingDate).getDate()-1))

IDA按F5反汇编伪代码错误Please use ida (not ida64) to decompile the current file

IDA不能F5反汇编成为伪代码&#xff0c;提示Warning Please use ida (not ida64) to decompile the current file 不给我转伪代码&#xff0c;不让我用ida64&#xff0c;哪我就用ida32 换32位IDA果然可以了 又可以愉快的玩耍了