java的线程池

线程池

  1. 可以做什么
  2. 怎么创建

先了解下线程的生命周期

线程的生命周期
解释:

  1. 新建:线程创建但未被启动
  2. 可运行:线程处于可运行的状态,当该线程有cpu的时间片后就可以执行
  3. 睡眠:线程进入计时等待,等待一段指定的时间,可以通过wait()方法,sleep方法,join()方法等方式
  4. 等待:线程进入等待模式,直到其他线程唤醒它,可以通过wait()方法,join()方法或lock类的条件等待方法进入该状态
  5. 阻塞:线程执行被阻止执行,因为它正在等待监视器锁定,其他的线程正在占用所用的锁定1,因此线程被阻塞
  6. 线程完成了其任务,或因为异常或其他原因进而终止运行

简单总结: 创建线程的方法:(留个记录)

  1. 通过继承thread类创建
  2. 通过实现runnable接口
  3. 使用匿名内部类
  4. 使用lambda表达式

线程池

线程池:简单的来说就是创建好的多个线程放在的一起的地方,这个地方就是线程池,我们使用线程的时候直接可以去这个地方拿取线程

通过上面线程的线程的周期可以知道线程池的好处:避免重复的创建线程和关闭线程所浪费的系统资源

创建线程池的方法

  1. 通过new ThreadPoolExecutor的方式
  2. 通过spring的ThreadPoolTaskExecutor方式,(建议使用这个)

以ThreadPoolExecutor类的有参构造有七个参数的方法为探讨:

  • int corePoolSize:核心线程数
  • nt maximumPoolSize:最大线程数
  • long keepAliveTime:临时线程的有效时间数值
  • TimeUnit unit:有效时间的单位(时,分,秒)
  • BlockingQueue workQueue:线程池使用的缓冲队列,指的是被提交的任务但尚未被执行的任务
  • ThreadFactory threadFactory:创建线程的方法,一般默认即可
  • RejectedExecutionHandler handler:拒绝策略,当任务太多来不及处理,如何拒绝任务

注意事项:

  1. 核心线程数的大小,参考任务的类型和系统资源进行合理配置,过大,导致浪费系统资源,过小,导致任务队列等待执行,影响系统的响应性能
  2. 任务队列的选择,参考任务的执行时长和任务的多少,有几个常见的队列,任务多执行时间短无界队列,任务少时间长的可以选择有界队列或优先级队列
  3. 线程池的拒绝策略常见四个,抛出异常,丢弃任务,丢弃最早的任务,调用者运行任务这个几个策略,具体参考业务的需要
  4. 线程的声明周期:创建初始化,设置参数,执行任务时需要提交任务到线程池,关闭线程时调用线程池的方法shutdown()或shutdownNow()方法关闭现场,并等待所有的任务完成,正确的管理线程池的声明周期可以避免资源的泄露和线程阻塞的问题
  5. 线程的安全:多个任务并发执行时,可能涉及到公共资源的访问,需要使用合适的同步机制来保证线程的安全

线程池的工作原理

线程池的流程

拒绝策略

  1. ThreadPoolExecutor.AbortPolicy(默认):当线程池无法处理新的任务时,会抛出RejectedExecutionException异常。
  2. ThreadPoolExecutor.CallerRunsPolicy:当线程池无法处理新的任务时,会将任务返回给调用者执行。也就是说,如果线程池被主线程调用,主线程会自己执行任务。
  3. ThreadPoolExecutor.DiscardPolicy:当线程池无法处理新的任务时,会直接丢弃这个任务,不会有任何提示或处理。
  4. ThreadPoolExecutor.DiscardOldestPolicy:当线程池无法处理新的任务时,会先尝试将最早的任务从队列中删除,然后再尝试执行新的任务。

除了以上四种常见的拒绝策略,也可以自定义拒绝策略,实现RejectedExecutionHandler接口,并重写rejectedExecution()方法来定义自己的处理逻辑。

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

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

相关文章

Smooth L1 loss |IoU|DIoU|CIoU|EIoU|aIoU|SIoU|wise-IoU的通俗讲解

文章目录 1. L1 Loss、L2 Loss 、Smooth L1 Loss1.1 L1 Loss和 L2 Loss1.2 Smooth L1 Loss1.3 Smooth L1 Loss 在目标检测中存在的缺陷2 IoU loss2.1 IoU原理2.2 IoU 的缺点2.3 代码3.GIoU Loss3.1 GIoU 原理3.2 GIoU loss 的缺点3.3 代码4.DIoU Loss4.1 DIoU的原理4.2 代码5.C…

[CSP-J 2022] 乘方

Description 小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a 和 b,求 ab 的值是多少。 ab 即 b 个 a 相乘的值,例如 23 即为 3 个 2 相乘,结果为 2228。 “简单!”小文心想&#…

抖音群控软件的作用是什么?

随着智能手机的普及和社交媒体的兴起,抖音成为了人们日常生活中不可或缺的一部分,许多人都通过抖音平台分享自己的生活、展示才艺、开展商业活动等。 然而,要想在抖音上获得更多的关注和收益,需要投入大量的时间和精力&#xff0…

2023下半年北京软考高项-系统架构设计师-考试心得分享

本博文至所有开发人员,一起分享,助力计划软考的所有战士们! 总得一句话:考的内容永远是自己不熟悉的,题目永远是自己没压中的,座位分配永远是无法白票的位置。。。。。。。惨不忍睹~!&#xff…

Elasticsearch集群搭建、数据分片以及位置坐标实现附近的人搜索

集群搭建、数据分片 es使用两种不同的方式来发现对方: 广播单播也可以同时使用两者,但默认的广播,单播需要已知节点列表来完成 一 广播方式 当es实例启动的时候,它发送了广播的ping请求到地址224.2.2.4:54328。而其他的es实例使用同样的集群名称响应了这个请求。 一般这…

【软件逆向】如何逆向Unity3D+il2cpp开发的安卓app【IDA Pro+il2CppDumper+DnSpy+AndroidKiller】

教程背景 课程作业要求使用反编译技术,在游戏中实现无碰撞。正常情况下碰撞后角色死亡,修改为直接穿过物体不死亡。 需要准备的软件 il2CppDumper。DnSpy。IDA Pro。AndroidKiller。 一、使用il2CppDumper导出程序集 将{my_game}.apk后缀修改为{my_…

节能增效:FP做独立站必须知道的黑科技

独立站作为由商家自己运营和管理,拥有完整的商品展示、订单处理等功能。相比于第三方电商平台,独立站的优势在于可以更好地控制产品质量、价格和服务,同时也有利于建立品牌的形象和忠诚度。 因此,对于一些希望形成自己的用户群体…

基于jsp的采购管理系统的分析与实现

物资采购管理系统是针对内部而设计的,应用于的局域网,这样可以使得内部管理更有效的联系起来。企业采购管理系统是将IT技术用于企业采购信息的管理, 它能够收集与存储企业采购的档案信息,提供更新与检索企业采购信息档案的接口;提…

OpenGL ES入门教程(二)之绘制一个平面桌子

OpenGL ES入门教程(二)之绘制一个平面桌子 前言0. OpenGL绘制图形的整体框架概述1. 定义顶点2. 定义着色器3. 加载着色器4. 编译着色器5. 将着色器链接为OpenGL程序对象6. 将着色器需要的数据与拷贝到本地的数组相关联7. 在屏幕上绘制图形8. 让桌子有边框…

【iOS免越狱】利用IOS自动化WebDriverAgent实现自动直播间自动输入

1.目标 由于看直播的时候主播叫我发 666,支持他,我肯定支持他呀,就一直发,可是后来发现太浪费时间了,能不能做一个直播间自动发 666 呢?于是就开始下面的操作。 2.操作环境 iPhone一台 WebDriverAgent …

latex空心小写字母、数字

公式中可用 R \R R、 E \mathbb{E} E 等空心大写字母表示集合、期望等,latex 用 \mathbb 实现。有时想用空心的小写字母(虚数单位,因 i 已用来表示下标)和数字(指示函数用空心 1),此时 \mathbb…

用于 GaN-HEMT 功率器件仿真的 TCAD 方法论

目录 标题:TCAD Methodology for Simulation of GaN-HEMT Power Devices来源:Proceedings of the 26th International Symposium on Power Semiconductor Devices & ICs(14年 ISPSD)GaN-HEMT仿真面临的挑战文章研究了什么文章的创新点文章的研究方法…

asp.net docker-compose添加volume配置

打开docker-compose.override.yml下面添加 volumes:killsb-one-sqldata:external: false 服务下面添加volume配置 volumes:- "./dapr/config/social-client.json:/app/OidcSettings.json" 添加volume配置成功

【LeetCode刷题-队列与栈】--225.用队列实现栈

225.用队列实现栈 class MyStack {Queue<Integer> queue1;Queue<Integer> queue2;public MyStack() {queue1 new LinkedList<Integer>();queue2 new LinkedList<Integer>();}public void push(int x) {queue2.offer(x);while(!queue1.isEmpty()){que…

Docker学习——②

文章目录 1、Docker是什么1.1 Docker本质1.2 Docker的引擎迭代1.3 Docker和虚拟机的区别1.4 Docker 为什么比虚拟机资源利用率高&#xff0c;启动快&#xff1f;1.5 Docker 和 JVM 虚拟化的区别&#xff1f; 2、Docker架构3、Docker生态3.1 新时代软件诉求3.2 Docker 解决方案 …

C#知识总结 基础篇(下)

目录 5类和继承 5.1类继承 5.2访问继承的成员 5.3屏蔽基类的成员 5.4访问基类的成员 5.5虚方法与覆写方法 5.6构造函数的执行顺序 5.7成员访问修饰符 5.8抽象类 5.9密封类与静态类 6.表达式与运算符 6.1运算符和重载 7.结构 7.1结构体的感念。 7.2结构构造函数与…

C++笔记之动态数组的申请和手动实现一个简单的vector

C笔记之动态数组的申请和手动实现一个简单的vector code review! 文章目录 C笔记之动态数组的申请和手动实现一个简单的vector1.C语言中动态数组的申请与使用1.动态数组的申请使用new和delete使用std::vector 1.std::vector的底层实现2.手动实现一个简单的vector:使用一个指向…

Rocky 安装jdk17

1&#xff09;检测jdk是否安装&#xff1a; #运行 java -version如果提示安装&#xff0c;则输入N&#xff0c;跳过 2&#xff09;检测cpu 类型 若未安装查看linux处理器架构&#xff1a; #运行 hostnamectl #或运行 arch 3&#xff09;去官网下载相应的编译版本的Jdk Or…

CCLINK IEFB总线转ETHERNET/IP网络的协议网关使欧姆龙和三菱的数据互通的简单配置方法

想要实现CCLINK IEFB总线和ETHERNET/IP网络的数据互通。 捷米JM-EIP-CCLKIE是一款ETHERNET/IP从站功能的通讯网关&#xff0c;该产品主要功能是实现CCLINK IEFB总线和ETHERNET/IP网络的数据互通。本网关连接到ETHERNET/IP总线和CCLINK IEFB总线上都可以做为从站使用。网关分别…

代码随想录(一刷完结!!!)Day43-图论:力扣第1971e、684m题

1971e. 寻找图中是否存在路径 题目链接 代码随想录文章讲解链接 方法一&#xff1a;并查集 用时&#xff1a;10m6s 思路 时间复杂度&#xff1a; O ( n log ⁡ n ) O(n\log{n}) O(nlogn)空间复杂度&#xff1a; O ( n ) O(n) O(n) C代码 class Solution { private:vecto…