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,一经查实,立即删除!

相关文章

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

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

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

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

基于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总线上都可以做为从站使用。网关分别…

C++笔记之lambda捕获列表中的‘this‘指针

C笔记之lambda捕获列表中的’this’指针 code review! 捕获this指针的lambda表达式在C中有多种应用场景。以下是一些示例&#xff1a; 异步编程&#xff1a;当您需要在异步操作中访问类的成员变量或成员函数时&#xff0c;可以使用捕获this指针的lambda表达式。例如&#xf…

STM32H750之FreeRTOS学习--------(四)中断管理

四、FreeRTOS中断管理 中断的概念不再过多叙述&#xff0c;学习过逻辑的都知道 中断的执行过程 中断请求 外设产生中断请求&#xff08;GPIO外部中断、定时器中断等&#xff09;响应中断 CPU停止执行当前程序&#xff0c;转而去执行中断处理程序&#xff08;ISR&#xff09;…

linux centos7安装colmap

centos安装colmap 一、安装依赖 sudo yum install \gflags-devel \glog-devel \glew-devel \atlas \atlas-devel \lapack-devel \blas-devel \flann-devel \lz4-devel \sqlite-devel \metis-devel \qt5-qtbase-devel二、编译安装colmap git clone https://github.com/colmap/…

nvm 下载 nodejs 速度慢问题解决

1、找到 nvm 的下载目录&#xff0c;在目录下找到 settings.txt 文件 2、打开 settings.txt 文件 &#xff0c;添加以下代码&#xff1a; node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/添加完成后再去下载即可。

Webpack的入口(entry)和出口(output)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Windows 下编译 TensorFlow 2.9.1 CC库

参考 Intel 的 tensorflow 编译指导&#xff0c;不过项目还是可以用 TF原本的&#xff0c;不是一定要选择Intel 的TF版本。 安装 MSVC 2019 安装 Intel OneDNN OneMKL 似乎也可以不安装 ( & ) https://www.intel.cn/content/www/cn/zh/developer/articles/tool/one…