java的线程池

2023-10-30

一、线程池概念
若不使用线程池,在新创建的线程start()后执行完run()就自动销毁了,造成了资源的浪费。使用线程池可以暂时存储线程。
线程池的主要核心原理:
在这里插入图片描述
线程池的代码实现:
在这里插入图片描述
注意:在实际开发中线程池并不会关闭,例如服务器要24小时接收用户的访问请求。
在这里插入图片描述
例如,定义实现Runnable接口的类设置任务:
在这里插入图片描述
使用线程池:
在这里插入图片描述
可以看到不同线程执行不同MyRunnable对象的任务。
而改写代码,增长线程的逐次提交的时间,会发现同一个线程连续执行不同MyRunnable对象的任务:
在这里插入图片描述
在这里插入图片描述
二、使用ThreadPoolExecutor自定义线程池(方便修改)
ThreadPoolExecutor线程池的几个核心元素:
核心线程数量,线程池中最大线程数量、空闲时间(值)、空闲时间(单位)、阻塞队列、创建线程的方式、要执行的任务过多时的解决方案。
例如,自定义一个线程池,核心线程有3个,临时线程有3个,阻塞队列长度为3。当有5个任务提交时,线程池现创建3个线程执行前3个任务,后2个任务在阻塞队列中排队等待;当有8个任务提交时,线程池现创建3个线程执行前3个任务,第4,5,6个任务阻塞队列中排队等待,线程池再创建2个临时线程取处理任务7和任务8。所有,只有当核心线程都在工作,阻塞队列被占满时才会创建临时线程。当有10个任务提交时,线程池现创建3个线程执行前3个任务,第4,5,6个任务阻塞队列中排队等待,线程池再创建3个临时线程取处理任务7、8、9,任务10会触发任务拒绝策略。java中有四个任务的拒绝策略,知道第一种即可。
在这里插入图片描述

   ThreadPoolExecutor pool = new ThreadPoolExecutor(
                         3,//核心线程数量,能小于0
                         6,//最大线程数量,不能小于0,大于等于核心线程数量
                        60,//空闲线程最大存活时间
                        TimeUnit.SECONDS,//时间单位,这里为秒
                            new ArrayBlockingQueue<>(3),//阻塞队列,不能为null
                            Executors.defaultThreadFactory(),//创建线程工厂,不能为null
                            new ThreadPoolExecutor.AbortPolicy()//任务的拒绝策略,不能为null
                    );

补充线程池大小的选择
最大并行数:与电脑的CPU型号有关。
在这里插入图片描述
上图中的电脑为4核8线程。
4核8线程可以理解为CPU有4个大脑,能同时做4件事情,而Intel采用超线程技术,将4个大脑虚拟成8个,能同时做8件事,此时最大并行数为8。
注意:极少数操作系统不会把所有的内核给一个软件,所以从任务管理器中查看并不一定对,可以利用如下代码查看;
在这里插入图片描述
程序分为两种,一种是CPU密集型运算,另一种是I/O密集型运算。若是CPU密集型运算,线程池大小= 最大并行数+1;若是I/O密集型运算(读取本地文件或数据库操作较多),线程池大小= 最大并行数 X 期望 CPU利用率X总时间/CPU计算时间,其中总时间=CPU计算时间+等待时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java的线程池 的相关文章

  • Mongo 可审核的 ZonedDateTime 字段在 Spring Boot 2 中不起作用

    在 Spring Boot 项目中 我使用 CreatedDate 之类的注释来保存有关创建 更新相应文档的日期的信息 整个项目都使用 ZonedDateTime 因此带注释的字段也是 ZonedDateTime 为了实现 Mongo 的日
  • jvm中本机代码如何转换为机器代码[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我读过一些文章说 jvm将字节码转换为机器码 jvm将字节码转换为本机代码 jvm 将字节码转换为系统调用 系统调用又由操作系统与硬件
  • 使用正则表达式验证输入字符串是否为 0-255 之间的数字

    我在将输入字符串与正则表达式匹配时遇到问题 我想验证输入数字在 0 255 之间并且长度最多应为 3 个字符 代码工作正常 但当我输入 000000 至任意长度时 显示 true 而不是 false 这是我的代码 String IP 000
  • Java 流 - 按嵌套列表分组(按第二顺序列出)

    我有以下数据结构 每个学生都有一个州列表 每个州都有一个城市列表 public class Student private int id private String name private List
  • Java“空白最终字段可能尚未初始化”方法中抛出异常

    我有一些代码 例如 final int var1 if isSomethingTrue var1 123 else throwErrorMethod int var2 var1 throwErrorMethod 的定义如下 private
  • Java Spark DataFrameReader java.lang.NegativeArraySizeException

    学习 Spark for java 并尝试阅读 csv文件为DataFrame使用DataFrameReader 甚至不能得到一个超级简单的 csv文件工作 因为我不断收到异常java lang NegativeArraySizeExcep
  • 初始堆大小无效。无法创建Java虚拟机

    我遇到了下一个问题 我尝试通过startup bat手动启动Tomcat 但似乎没有显示任何结果 然后我尝试运行shutdown bat 控制台显示如下 D apache tomcat 7 0 35 bin gt startup bat U
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • EMF Eclipse:带有自定义字段(属性)的枚举

    好吧 在 Java 中这是可能的 import org eclipse emf common util Enumerator public enum MyEnum implements Enumerator LITERAL1 0 Name
  • 按文件名过滤 eclipse 中的警告

    我们使用 Eclipse 进行 Java 开发 并使用 Maven 将 JSP 编译成 servlet 以便在嵌入式 Jetty 实例中使用 这意味着要从 Eclipse 运行该项目 我必须包含 target jsp source 作为源文
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • 如何使用 Selenium 中的索引切换到窗口

    由于selenium不提供切换到窗口 多个窗口 的方法 但我想使用index html自定义方法来切换到不同的窗口 但下面的代码没有按预期工作 请建议以下方法的最佳实施 public void switchToWindowIndex int
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 获取包中声明的所有 Java 类的名称

    我正在编写一个功能 它将有助于将类放入我的程序的某个包中 另外 我只想要子类某个类的类 我需要这些类才能调用它们的静态方法 有没有一种自动的方法来做到这一点 如果是的话 速度慢吗 如果我不清楚 我想要的是这样的 ArrayList
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • 更新分页。是否可以?

    他们是否存在一些方法来处理更新分页 例如我有 100 行类型 Id private Integer id Column private boolean flag Column private Date last 一开始它们看起来像 id f
  • 如何列出Resources文件夹中的所有文件(java/scala)

    我正在编写一个函数 需要访问资源中的文件夹 并循环遍历所有文件名 如果这些文件符合条件 则加载这些文件 new File getClass getResource images sprites getPath listFiles 返回空指针
  • 获取Java中ResultSet返回的行数

    我用过一个ResultSet返回一定数量的行 我的代码是这样的 ResultSet res getData if res next System out println No Data Found while res next code t
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • 【数据结构】图的遍历

    深度优先遍历 深度优先遍历思想 对于图 选中一个结点 访问和其相邻的 未被访问过的点 全部访问完毕后回退到上一个结点 直至全部结点访问完毕 类似于图的先序遍历 如有邻接表 则按邻接矩阵的顺序遍历 时间复杂度 O v 对于邻接矩阵 选中一个结
  • 台架服务器系统,潍坊发动机台架网,快装小车服务器

    潍坊发动机台架网 快装小车服务器 rjd3ert4 潍坊发动机台架网 快装小车服务器 而底盘测功机的功能则是电涡流机通过滚筒施加给驱动轮反向制动力 一是强制受检车发动机因驱动轮加大负载而降速增扭 二是将反向制动力值以电量变化的方式给出 随着
  • Linux 硬链接 软连接

    情景说明 有时候在Linux下我们有一个大的工程跟绝对路径相关 现在又想通过eclipse查看源码和修改源码 那么问题来了 1 如果我们把源码拷贝一份到eclipse工程里面 那么此时修改了某个文件之后还得手动复制到可以运行的原始工程目录下
  • 管理学之父德鲁克:目标管理的八要素和七步骤

    管理学之父德鲁克 目标管理的八要素和七步骤 转 一 目标管理 MBO 的内涵 1954年 管理大师彼得 德鲁克在其名著 管理的实践 中提出了 目标管理 的概念 并提出了 目标管理和自我控制 的主张 彼得 德鲁克认为 并不是有了工作才有目标
  • ubuntu系统常用命令

    注销 sudo pkill Xorg 安装下载好的按照包 sudo dpkg i sogoupinyin 4 2 1 145 amd64 deb 打开带权限的文件管理 sudo nautilus 安装torch的代码 pip install
  • windows 查看当前目录及文件

    1 显示当前所在目录 cd 2 盘符切换 eg 从C盘切换到D盘 D 3 查看当前目录文件 dir 4 当前盘符内目录切换 cd path
  • 使用云服务器和Frp(快速反向代理)框架快速部署实现内网穿透

    目录 一 背景 1 1 内网穿透 1 2 Frp介绍 1 3 Frp配置流程 二 云服务器配置 2 1 配置安全组 2 2 编写frps ini 三 内网主机配置 3 1 编辑frpc ini文件 3 2 启动服务并配置开机自启动 四 参考
  • bzoj P3309 DZY Loves Math——solution

    对于正整数n 定义f n 为n所含质因子的最大幂指数 例如f 1960 f 2 3 5 1 7 2 3 f 10007 1 f 1 0 给定正整数a b 求 sum i 1 i lt a sum j 1 j lt b f gcd i j b
  • 华硕服务器主板型号命名规则,详细解读主板厂商命名规则——华硕篇

    1华硕主板的命名规则共有三套 写在前面 面对目前DIY市场中品牌 型号各异的主板 很多朋友在选择主板时都无从下手 其实 大部分厂商都有着一套完善的命名规则 能够直接反映出一款主板的部分或者全部信息 可能有一些热爱DIY的朋友在网上搜索过类似
  • Laravel核心技术解析(1)—— Composer 组件管理与自动加载

    Composer作为PHP的组件化管理工具 实现了laravel框架的组件安装 更新 移除 以及自动加载功能 下面就深入解析这是如何实现的 使用Composer安装组件 首先需要创建composer json文件 composer json
  • [附源码]JSP+ssm计算机毕业设计高素质农民培训系统z4lth【源码、数据库、LW、部署】

    项目运行 项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEcl
  • mongodb笔记(一)基础命令、增删改查、高级查询、聚合

    mongodb笔记 nosql介绍 关系型与非关系对比 mongodb mongodb安装 mongodb 客户端 基础命令 数据库 集合 数据类型 增删改 插入 查询 保存 更新 删除 高级查询 法find 运算符 支持正则 limit和
  • flask框架实现大文件分块上传接口

    传统的文件上传接口一般是一次性将整个文件上传到服务器 而文件分块上传需要将文件分成多个块逐个上传 服务器端需要接收这些块 并在最后将它们合并成一个完整的文件 因此 您需要对您的后端接口进行如下改变 接口需要支持分块上传 后端接口需要支持分块
  • UE4触摸屏旋转、双指缩放

    UE4触摸屏旋转 双指缩放 前言 最近接触触摸屏项目案列 自己研究了一下旋转和双指缩放的实现方法 记录一下
  • sql使用DATE_FORMAT格式化日期

    一 样例 sql使用format格式化查询字段 例如 select DATE FORMAT operatetime y m d H i s operatetime from tbrecord where id 1 结果 2020 06 08
  • RNA-seq——快速下载SRA数据、解决fq文件中测序质量全为 ‘?‘ 的问题

    写在前面 在学习RNA seq时 需要从网上下载公开数据集来上手分析 大部分教程都很古老 其中在ncbi中ftp的下载链接已经不存在了 甚至可以直接下载fastq文件 但是 直接下载的fastq文件做fastqc之后结果为一条直线 因为文件
  • [Docker] Docker 容器配置环境变量重启后失效问题解决

    Docker 容器配置的环境变量重启时失效问题解决 配置环境 在 etc profile 配置环境变量 JAVA HOME opt java jdk 15 0 2 export PATH JAVA HOME bin PATH 然后在 etc
  • 智能家居网络系统的设计

    今天开始学习制作智能家居网络系统 这个项目相对简单的多 但对于新手还是有难度的 所以今天我写出来 尽我最大努力写详细一点 单本人能力实在是有限 文章中肯定会出现很多错误 望大家指出来 一定改正 讲解过程中所涉及全部代码下载地址 智能家居网络
  • vue3中 :visible.sync 和slot报错

    1 visible sync visible指的是属性绑定 表示弹框的显示隐藏 当 visible的值为ture的时候 弹框显示 当为false的时候 弹框隐藏 visible sync指的就是同步动态双向的来表示visible的值 当我们
  • java的线程池

    一 线程池概念 若不使用线程池 在新创建的线程start 后执行完run 就自动销毁了 造成了资源的浪费 使用线程池可以暂时存储线程 线程池的主要核心原理 线程池的代码实现 注意 在实际开发中线程池并不会关闭 例如服务器要24小时接收用户的