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.rhkb.cn/news/179944.html

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

相关文章

【Kubernetes】初识k8s--扫盲阶段

文章目录 1、k8s概述2、为什么要有k8s2.1 回顾以往的应用部署方式2.2 容器具有的优势 3、k8s能带来什么 1、k8s概述 kubernetes是一个可移植、可扩展的开源平台,用于管理 容器化 的工作负载和服务,可促进申明式配置和自动化。kubernetes拥有一个庞大且快…

【算法】背包问题——01背包

题目 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数&#xff0…

HTTP/HTTPS、SSL/TLS、WS/WSS 都是什么?

有同学问我,HTTP/HTTPS、SSL/TLS、WS/WSS 这都是些什么?那我们就先从概念说起: HTTP 是超文本传输协议,信息是通过明文传输。HTTPS 是在 HTTP 的基础上信息通过加密后再传输。SSL 是实现 HTTPS 信息传输加密的算法。TLS 是 SSL 的…

Redis学习系统(持续更新中)

RedisExample 课程介绍 目标是提供一个高效、可靠的学习和实践Redis的环境。我们将通过搭建Redis集群、实现缓存数据的持久化存储、制定缓存数据的淘汰策略以及同步缓存数据等步骤来深入了解和学习Redis的特性和功能。通过这个项目,你可以掌握Redis的核心概念和技…

可视化协作软件有哪些?这10款神器助力团队合作!

可视化协作已经成为一个时下热门词汇,问题是对其并没有一个清晰的定义。有人认为它代表了一个云端环境,具有能够使办公室、混合办公和远程员工一起工作的功能。其他人则认为可视化协作不过是数字化白板而已。 随着这个术语变得更加流行,许多…

算法通关村第五关-白银挑战队列经典问题

大家好我是苏麟 , 今天带来几道经典小题 . 大纲 两数之和 两数之和 相信大家对这道题还是很眼熟的 , 打开LeetCode第一道题就是它 , 对它可真的又爱又恨 , 很多新手朋友们想刷LeetCode但又不知道从哪开始就打开了第一题 , 结果就对算法失去了信心 . 这道题找对方法还是很容易…

OpenShift - 利用容器的特权配置实现对OpenShift攻击

《OpenShift / RHEL / DevSecOps 汇总目录》 说明:本文已经在 OpenShift 4.13 的环境中验证 本文是《容器安全 - 利用容器的特权配置实现对Kubernetes攻击》的后续篇,来介绍 在 OpenShift 环境中的容器特权配置和攻击过程和 Kubernetes 环境的差异。 文…

macOS 安装brew

参考链接: https://mirrors4.tuna.tsinghua.edu.cn/help/homebrew/ https://www.yii666.com/blog/429332.html 安装中科大源的: https://zhuanlan.zhihu.com/p/470873649

cplex基础入门(三)之运行调试debug

聊聊题外话,你用cplex进行代码编写,其实你也可以相当于在编程一样,那对于编程,有一项非常核心的能力就是代码调试以及debug的能力,那你运行以及编写cplex也是一样,同样需要你会使用调试的方式,来…

前端学习之webpack的使用

概述 webpack是一个流行的前端项目构建工具(打包工具),可以解决当前web开发中所面临的问题。 webpack提供了友好的模块化支持,以及代码压缩混淆、处理js兼容问题、性能优化等强大的功能,从而让程序员把工作重心放到具…

mysql---索引

概要 索引:排序的列表,列表当中存储的是索引的值和包含这个值的数据所在的行的物理地址 作用:加快查找速度 注:索引要在创建表时尽量创建完全,后期添加影响变动大。 索引也需要占用磁盘空间,innodb表数据…

常用的Linux远程桌面配置方法

TigerVNC 是 VNC(虚拟网络计算)的高性能、平台中立的实现,VNC 是一种客户端/服务器应用程序,允许用户在远程计算机上启动图形应用程序并与之交互。 TigerVNC 提供运行 3D 和视频应用程序所需的性能水平,并尝试在其支持…

【MongoDB】Windows 安装MongoDB 6.0

一、下载安装包 安装包下载地址https://www.mongodb.com/try/download/community这里我选择的是 二、解压并安装 1、解压 这里我将压缩包解压到了D盘,并重命名成了mongodb,解压后的目录如下: 2、创建配置文件 在D:\mongodb下新建conf目录…

Jetpack Compose 中下拉框实现

下拉菜单主要 以下三种实现: ExperimentalMaterialApi Composable fun ExposedDropdownMenuBox(expanded: Boolean,onExpandedChange: (Boolean) -> Unit,modifier: Modifier Modifier,content: Composable ExposedDropdownMenuBoxScope.() -> Unit )实现代…

5G及其后的5G非地面网络:趋势和研究挑战-HARQ部分

NTN组件纳入5G架构第一步 在NTN SI中定义了一组架构选项。就NT部分而言,已确定了两大类:星载(即基于卫星的通信平台)和机载(即HAPS)设备 并行管理HARQ最大进程数 NHARQRTT(NTX−1)2μ NTX:传输…

段错误如何调试

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言段错误产生的原因问题1:访问不存在的内存地址问题2:访问只读的内存地址问题3:栈溢出问题4:内存越界如何解决段错…

虹科示波器 | 汽车免拆检修 | 2013款大众途观车发动机加速无力

一、故障现象 一辆2013款大众途观车,搭载CGM发动机,累计行驶里程约为12.6万km。车主进厂反映,发动机加速无力。 二、故障诊断 接车后试车,发动机怠速运转正常;原地将加速踏板踩到底,发动机转速最高只能达到…

专为个人打造专注工作的便签APP工具推荐哪个

工作中很多人都比较懒散,工作起来动力不足,常常拖延消极怠工,等到一天结束后进行工作盘点时才发现很多项任务都没有处理完;这和日常工作不能专注于工作有很大的关系。 专注工作,在日常办公时可以选择一些好用的手机便…

JsonPath 数据快速查找和提取工具

常用语法 表达式说明$表示根元素$.key选择根元素下的指定键名的值$.*选择根元素下的所有属性值$.array[*]选择根元素中的数组的所有元素$.key[subkey]选择根元素中的键名为key,子键名为subkey的值$.key[*].subkey选择根元素中的键名为key的所有元素的子键名为subke…

【深度学习项目从下载到运行】

本文只是介绍一个大致的流程,简单的介绍一个深度学习项目整体的一个从下载到运行的框架让初学者入门。 实际在运行的过程中可能会遇到各种各样的问题。 目录 代码下载python项目各个文件夹的解释一个深度学习项目要包含的各个模块配置环境命令行运行项目且看项目的参…