当前位置: 首页 > news >正文

[JavaEE]线程池


专栏简介: JavaEE从入门到进阶

题目来源: leetcode,牛客,剑指offer.

创作目标: 记录学习JavaEE学习历程

希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长.

学历代表过去,能力代表现在,学习能力代表未来! 


目录:

1. 线程池是什么?

2. 线程池的实现原理

3. 标准库中的线程池.

         3.1 线程池的使用.

3.2 线程池的创建.

4. 实现线程池


1. 线程池是什么?

线程存在的意义:

想要搞清楚什么是线程池 , 首先要明白线程存在的意义. 由于使用进程并发编程开销过大 , 于是引入了线程 , 线程也叫做 "轻量级进程" , 创建/调度/销毁线程都比进程更加高效. 此时多线程在很多时候就可以代替多进程实现并发编程了.

随着并发度的提高 , 以及我们对性能标准的要求越来越高 , 线程已没有之前认为的那么"轻量"了 ,当我们需要频繁的创建/销毁线程 , 开销还是挺大的. 为了进一步提高效率 , 此时有两种方法:

  • 1. 搞一个更轻量的线程=>协程/纤程 , Go语言之所以天然支持高并发 , 其原因之一就是内置了协程 , 但遗憾的是Java标准库中没有.
  • 2. 使用线程池 , 来降低 创建/销毁线程的开销 , 很明显后者根符合实际情况.

线程池: 

因此线程池就是我们的最终选择 , 说到线程池 , 可能会想到字符串常量池数据库连接池 , 其实原理类似 , 就是把需要使用的线程创建好放到"池"中 , 后期需要使用的时候直接从池中取 , 使用完毕后再放回池中. 这两个操作比 创建/销毁 线程更高效 , 而且 创建/销毁 线程由操作系统内核调用 , 线程池 取出/放入 操作是代码就能是实现的.

操作系统内核:

相比于内核来说 , 用户态执行代码的行为是可控的 , 如果让内核在系统中 创建/和销毁 一个线程 , 就需要让内核来执行 , 但此时你不清楚内核背负着多少个任务(内核要为所有的程序提供服务) , 这样执行效率就非常不可控. 

例如 , 将银行柜台当做操作系统内核 , 将银行大厅当做用户态. 在银行大厅 , 用户都是自由的想干啥干啥 , 类比线程池中 取出/放入 线程(非常干净利落的完成). 但有些操作需要在柜台内部完成 , 就好比是程序中的内核态 , 内核会给程序提供一些API 作为系统调用 , 程序可以通过系统调用 , 驱使内核完成一些工作(创建/销毁线程). 例如 , 用户想复印身份证 , 如果交给银行柜台去办 , 那么工作人员不一定立即去执行 , 因为工作人员为所有用户服务 , 可能需要先完成之前分配的任务再处理当前任务.

线程池的优点:

  • 降低资源消耗. 通过重复利用创建好的线程 , 降低线程 创建/销毁 的造成的开销.
  • 提高响应速度. 当任务到达时 , 任务可以不需等待就立即创建.
  • 提高线程的可管理性. 线程是稀缺资源 , 如何无限制的创建不仅会消耗系统资源 , 还会降低系统的稳定性 , 使用线程池可以统一分配 , 调优和监控. 但是要合理使用线程池 , 还需对其实现原理了然于心.

2. 线程池的实现原理

当我们向线程池提交一个任务之后 , 线程池如何处理这个任务呢? 下面是线程池的主要处理流程:

  • 1. 线程池判断核心线程池里的线程是否都在执行任务. 如果不是 , 则创建一个新的工作线程来执行任务. 如果核心线程池里的线程都在执行任务 , 则进入下个流程.
  • 2. 线程池判断工作队列是否已满. 如果工作队列未满 , 则将新提交的任务存储在工作队列中. 如果工作队列满了 , 则进入下个流程.
  • 3. 线程池判断线程池中的线程是否都处于工作状态. 如果不是 , 则创建一个新的工作线程来执行任务. 如果已经满了 , 则交给饱和策略来处理这个任务.

 ThreadPoolExecutor 执行 execute() 方法的示意图:

  •  1. 如果当前运行的线程少于 corePoolSize , 则创建新线程来执行任务(注意 , 这一步骤需要获取全局锁).
  •  2. 如果运行的线程等于或多于 corePoolSize , 则将任务加入 BlockingQueue 队列.
  •  3. 如果队列已满 , 则创建新的线程来执行任务.(注意 , 这一步骤需要获取全局锁)
  •  4. 如果创建的线程将使当前运行的线程超过 maximumPoolSize , 任务将被拒绝 , 并调用 RejetctedExecutionHandler.rejectedExecution()方法.

3. 标准库中的线程池.


3.1 线程池的使用.

此处构造出一个 10 个线程的线程池 , 然后就可以随时安排任务让线程执行.

public static void main(String[] args) {ExecutorService pool = Executors.newFixedThreadPool(10);for (int i = 0; i < 1000; i++) {int n = i;pool.submit(new Runnable() {@Overridepublic void run() {System.out.println("Hello" + n);}});}}

程序运行结束后 , 虽然 main 线程结束了 , 但整个进程没有结束. 这是因为线程池中的线程都是前台线程 , 会阻止进程结束.

变量捕获

 这段代码有个疑惑的点 , 为什么变量 i 要赋值给 n 后再打印?

这时因为 , 此处的 run() 方法属于 Runnable. 这个方法的执行时机 , 不是立刻马上而是在未来的某个节点(由于线程的抢占式执行随机调度). 而 i 属于主线程中的局部变量(在主线程的栈上) , 随着主线程这里的 for 执行完就销毁了 , 但是很有可能当主线程执行完后 , 当前 run() 的任务在线程池里还没排到. 因此为了避免作用域的差异 , 导致后续执行 run() 时 i 已经销毁 , 于是有了变量捕获 , 也就是主线程的 i 给当前 run() 方法的栈上拷贝一份.


3.2 线程池的创建.

我们可以通过 ThreadPoolExecutor 来创建一个线程池.

 创建一个线程池时需要输入以下几个参数 , 如下:

  • 1. corePoolSize (核心线程数的大小): 当提交一个任务到线程池时 , 线程池会创建一个线程来执行任务 , 即使其他空闲的线程能够执行新任务也会创建线程 , 等到需要执行的任务数大于线程池基本大小就不再会创建. 如果调用了线程池的 prestartAllCoreThreads() 方法 , 线程池就会提前创建并启动所有基本线程.(核心线程就相当于公司中的正式员工 , 基本线程相当于实习员工)
  • 2.maximumPoolSize(最大线程数): 线程池允许创建的最大线程数 , 如果队列满了 , 并且已创建的线程数小于最大线程数 , 则线程池会创建新的线程执行任务.(值得注意的是 , 如果使用了无界任务队列这个参数就没有什么效果)

举个例子 , 线程池中的线程扮演者两类角色 , 核心线程扮演者正式员工 , 其余线程扮演者实习员工.一但公司有任务都是正式员工优先做 , 实在缺人手才会招实习员工. 而且正式员工运行摸鱼 , 实习员工没有这项特权 , 一但摸鱼时间过久就会被销毁.所以线程池的整体策略就是: 正式员工保底 , 临时工动态调整. 那么实际开发中线程池的线程数设置为多少合适呢?

这时就需要分情况讨论 , 考虑两个极端情况:

  • 1). CPU密集型 , 每个线程需要执行的任务都需要高速运行CPU(进行一系列算数操作) , 此时线程池的线程数 . 最多不应该超过 CPU 核数 , 因为设置的线程过多也没有机会执行.
  • 2). IO密集型 , 每个线程的任务就是等待 IO (读写硬盘 , 读写网卡 , 等待用户输入.....) , 不会占用过多的 CPU , 即使线程处于阻塞状态也会参与 CPU 的调度 , 这时理论上来说 , 线程数可以设置为无穷大 , 不会受制于 CPU 核数.

综上 , 由于实际开发过程中都是两种情况的结合 , 因此需要我们进行实际的测试 , 看其结果的效率和实际资源占用是否符合我们预期.

  • 3. keepAliveTime(线程活动保持时间): 线程池的工作空闲后 , 保持存活的时间.(也就是实习生摸鱼的最大时间)
  • 4. TimeUmit(线程活动保持时间的单位): 可选时间单位有天 (DAYS) , 小时(HOURS) , 分钟(MINUTES) , 毫秒(MILLISECONDS) , 微秒(MICROSECONDS , 千分之一毫秒)和纳秒(NANOSECONDS , 千分之一微秒).
  • 5. BlockingQueue<Runnable> workQueue(任务队列): 用于保存等待执行的任务的阻塞队列.
  • 6.RejectedExecutionHandler(饱和策略): 当队列和线程都满了 , 说明线程池处于饱和状态 , 那么必须采取一种策略处理提交的新任务. 这个策略默认情况下是AbortPolicy. 
  • 7.threadFactory: 用线程提供的工厂类来创建线程.

在 JDK 1.5 之后 Java 线程池框架提供了以下四种策略:

  • AbortPolicy: 直接抛出异常.
  • CallerRunsPolicy: 只用调用者所在的线程来执行任务.
  • DiscardOldestPolicy: 丢弃队列中最近的一个任务 , 并执行当前任务.
  • DiscardPolicy: 不处理 , 丢弃掉.

4. 实现线程池.

实现线程池的核心就两点: 1.创建线程. 2. 注册任务给线程池.

class MyThreadPool {private BlockingQueue<Runnable> queue = new LinkedBlockingQueue();//使用构造方法创建线程public MyThreadPool(int n) {for (int i = 0; i < n; i++) {Thread t = new Thread(() -> {while (true) {try {Runnable runnable = queue.take();runnable.run();} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();}}//注册任务给线程池public void submit(Runnable runnable) {try {queue.put(runnable);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}public class ThreadDemo13 {public static void main(String[] args) {MyThreadPool myThreadPool = new MyThreadPool(10);for (int i = 0; i < 1000; i++) {int n = i;myThreadPool.submit(new Runnable() {@Overridepublic void run() {System.out.println("Hello" + n);}});}}
}

相关文章:

Python 潮流周刊#48:Python 3.14 的发布计划

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 本期分享了 12 篇文章,11 个开源项目,赠书 5 本《图解TCP/IP(第…...

P9753 [CSP-S 2023] 消消乐

P9753 [CSP-S 2023] 消消乐 这题想到了 50pts,想不出来怎么优化了。 50pts:考虑枚举子串左端点,模拟操作过程,直接用栈模拟,遇到相同的则删去,如果某个时刻栈为空,那么合法子串数加一。 考场上只想到为空的时候可消除,下面的性质才是关键的。因为我们枚举左端点,每次只…...

4.26(小组冲刺第一天)

1...

ClickHouse 高可用之副本

文章目录 ClickHouse 副本支持副本的引擎配置高可用副本副本应用1.副本表概述2.创建副本表3.写入模拟数据4.副本验证 扩展 —— 在 Zookeeper 中查看副本表信息 ClickHouse 副本 ClickHouse 通过副本机制&#xff0c;可以将数据拷贝存储在不同的节点上。这样&#xff0c;如果一…...

Python浅谈清朝秋海棠叶版图

1、清朝疆域概述&#xff1a; 清朝是我国最后一个封建王朝&#xff0c;其始于1616年建州女真部努尔哈赤建立后金&#xff0c;此后统一女真各部、东北地区。后又降服漠南蒙古&#xff0c;1644年入关打败农民起义军、灭南明&#xff0c;削三藩&#xff0c;复台湾。后又收外蒙&am…...

七段数码管

import turtle, datetime def drawGap(): # 绘制数码管间隔 turtle.penup() turtle.fd(5) def drawLine(draw): # 绘制单段数码管 drawGap() turtle.pendown() if draw else turtle.penup() turtle.fd(40) drawGap() turtle.right(90) def drawDigit(d): # 根据数字绘制七段…...

[JavaEE]线程池

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1. 线程池是什么? 2. 线程池的实现原理 3. 标准…...

Redis缓存污染了怎么办?

我们应用Redis缓存时&#xff0c;如果能缓存会被反复访问的数据&#xff0c;那就能加速业务应用的访问&#xff0c;但是&#xff0c;如果发生了缓存污染&#xff0c;那么&#xff0c;缓存对业务应用的加速作用就减少了。 在一些场景下&#xff0c;有些数据被访问的次数非常小&…...

特斯拉印证成本仍是工业制造取胜的关键,反证中国制造的优势

近20年来&#xff0c;业界对于工业制造的竞争优势开始逐渐偏离成本控制&#xff0c;然而如今特斯拉在全球的成功却正在印证着工业制造的成功仍然在于成本&#xff0c;成本才是工业制造取胜的关键&#xff0c;其他任何被吹嘘的个性化、创新等全都是骗人的把戏。特斯拉的成功曾被…...

工具及方法 - 斗地主技巧

斗地主游戏起源 斗地主是流行于湖北武汉、汉阳一带的一种扑克游戏。游戏需由3个玩家进行&#xff0c;用一副54张牌(连鬼牌)&#xff0c;其中一方为地主&#xff0c;其余两家为另一方&#xff0c;双方对战&#xff0c;先出完牌的一方获胜。斗地主起源于湖北武汉汉阳一带&#xf…...

BIO NIO AIO IO多路复用的区别

1、基础概念 1.1、阻塞非阻塞和同步异步的结合 下面通过例子来具体说明&#xff1a; 同步阻塞&#xff1a; 小明一直盯着下载进度条&#xff0c;到100%的时候完成。 同步体现在&#xff1a;小明关注下载进度条并等待完成通知。&#xff08;可以看成同步是我主动关注任务完成的…...

数学建模——降维算法

降维 降维的意义 降低无效、错误数据对建模的影响&#xff0c;提高建模的准确性少量切具有代表性的数据将大幅缩减挖掘所需的时间降低存储数据的成本 需要降维的情况 维度灾难。很难有一个简洁的模型在高维空间中依旧具有鲁棒性&#xff0c;而随着模型复杂度的增加&#xf…...

04_iic子系统

总结 iic_client和iic_driver 加入iic总线的思想和paltform总线的玩法一样 把iic设备和驱动注册到iic总线中 构造出字符设备驱动和设备节点供app进行操作 但是iic硬件设备是挂在iic控制器下面的 所以iic控制器也会有自己的驱动和设备树节点 厂家一般都会帮做好 我们写的iic_dr…...

离散系统的数字PID控制仿真-3

离散PID控制的封装界面如图1所示&#xff0c;在该界面中可设定PID的三个系数、采样时间及控制输入的上下界。仿真结果如图2所示。图1 离散PID控制的封装界面图2 阶跃响应结果仿真图&#xff1a;离散PID控制的比例、积分和微分三项分别由Simulink模块实现。离散PID控制器仿真图&…...

如何好好说话-第12章 理清楚问题就是答案

生活中该不该积极主动与别人展开社交活动&#xff1f;有些时候社交活动并不开心&#xff0c;仅仅只是无聊的闲才。但他确实能拉拢人际关系&#xff0c;帮我们获得近身套路。而且有一种观点认为不善于社交的人是不成功的。注意以上说的这些都是偏见。当我们站在一个更高的维度认…...

ice规则引擎==启动流程和源码分析

启动 git clone代码 创建数据库ice&#xff0c;执行ice server里的sql&#xff0c;修改ice server的配置文件中的数据库信息 启动ice server 和ice test 访问ice server localhost:8121 新增一个app,默认给了个id为1&#xff0c;这个1可以看到在ice test的配置文件中指定…...

进度管理(上)

规划进度管理 定义&#xff1a;规划进度管理是为实施项目进度管理制定计划的过程。 输入&#xff1a; 1、项目管理计划 2、项目章程&#xff08;包含里程碑&#xff0c;这个和规划进度有直接干系&#xff09; 3、组织过程资产 4、事业环境因素。 输出&#xff1a;进度管…...

2021 XV6 8:locks

实验有两个任务&#xff0c;都是为了减少锁的竞争从而提高运行效率。Memory allocator一开始我们是有个双向链表用来存储空闲的内存块&#xff0c;如果很多个进程要竞争这一个链表&#xff0c;就会把效率降低很多。所以我们把链表拆成每个CPU一个&#xff0c;在申请内存的时候就…...

JUC面试(十一)——LockSupport

可重入锁 可重入锁又名递归锁 是指在同一个线程在外层方法获取锁的时候&#xff0c;再进入该线程的内层方法会自动获取锁(前提&#xff0c;锁对象得是同一个对象)&#xff0c;不会因为之前已经获取过的锁还没释放而阻塞。 Java中ReentrantLock和synchronized都是可重入锁&am…...

Datawhale 202301 设计模式 | 人工智能 现代方法 习题

Exercise 1 绪论 Q&#xff1a;用您自己的话来定义&#xff1a;&#xff08;a&#xff09;智能&#xff0c;&#xff08;b&#xff09;人工智能&#xff0c;&#xff08;c&#xff09;智能体&#xff0c;&#xff08;d&#xff09;理性&#xff0c;&#xff08;e&#xff09;逻…...

k8s安装dashboard面板

k8s dashboard github地址&#xff1a;https://github.com/kubernetes/dashboard注意&#xff1a;dashboard版本要和k8s版本匹配&#xff0c;具体参考release里的Compatibility&#xff1a;https://github.com/kubernetes/dashboard/releases安装命令wget https://raw.githubus…...

最详细、最仔细、最清晰的几道python习题及答案(建议收藏哦)

名字&#xff1a;阿玥的小东东 学习&#xff1a;python。c 主页&#xff1a;没了 今天阿玥带大家来看看更详细的python的练习题 目录 1. 在python中, list, tuple, dict, set有什么区别, 主要应用在什么样的场景? 2. 静态函数, 类函数, 成员函数、属性函数的区别? 2.1静态…...

逆水寒魔兽老兵服副本攻略及代码分析(英雄武林风云录,后续更新舞阳城、扬州、清明等副本攻略)

文章目录一、武林风云录1&#xff09;老一&#xff1a;陈斩槐&#xff08;只有四个机制&#xff0c;dps压力不大&#xff0c;留爆发打影子就行&#xff09;&#xff08;1&#xff09;点名红色扇形区域&#xff08;2&#xff09;点名红色长条&#xff0c;注意最后还有一段大劈&a…...

SpringMVC总结

Spring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。SpringMVC是一种web层的mvc框架&#xff0c;用于替代servlet&#xff08;处理响应请求&#xff0c;获取表单参数&#xff0c;表单验…...

二进制部署kubernetes高可用集群

二进制部署kubernetes高可用集群 一、单节点部署 1、集群节点规划&#xff08;均是24位掩码&#xff09; 负载均衡节点Master节点Node节点Harbor私有仓库节点nginx110.4.7.23master110.4.7.11node110.4.7.2110.4.7.200nginx210.4.7.24master210.4.7.12node210.4.7.22 2、基本…...

机器学习(七):Azure机器学习模型搭建实验

文章目录 Azure机器学习模型搭建实验 前言 Azure平台简介 Azure机器学习实验 Azure机器学习模型搭建实验 前言 了解Azure机器学习平台&#xff0c;知道机器学习流程。 Azure平台简介 Azure Machine Learning&#xff08;简称“AML”&#xff09;是微软在其公有云Azure上推…...

第二类换元法倒代换专项训练

前置知识&#xff1a;第二类换元法 题1&#xff1a; 计算∫1x10xdx\int\dfrac{1}{x^{10}x}dx∫x10x1​dx 解&#xff1a; \qquad令x1tx\dfrac 1txt1​&#xff0c;t1xt\dfrac 1xtx1​&#xff0c;dx−1t2dtdx-\dfrac{1}{t^2}dtdx−t21​dt \qquad原式∫11t101t⋅(−1t2)dt−∫…...

VMware虚拟机无法向宿主机拖放文件

宿主机环境&#xff1a; Windows 10 x64专业工作站版 VMware workstation pro 17 TotalCommander 9.21a 虚拟机环境&#xff1a; Windows 10 x64专业工作站版 TotalCommander 9.21a 现象&#xff1a; 从虚拟机的TC向宿主机TC拖放文件时&#xff0c;光标显示为禁止drop的图…...

Java基础语法——运算符与表达式

目录 Eclipse下载 安装 使用 运算符 键盘录入 Eclipse下载 安装 使用 Eclipse的概述(磨刀不误砍柴工)——是一个IDE(集成开发环境)Eclipse的特点描述&#xff08;1&#xff09;免费 &#xff08;2&#xff09;纯Java语言编写 &#xff08;3&#xff09;免安装 &#xff08…...

连通性1(Tarjan 理论版)

目录 一、无向图割点、桥、双连通分量 Tarjan 算法求割点和桥&#xff08;割边&#xff09; “割点”代码 边双和点双连通分量 边双连通分量 和 点双连通分量 的缩点 二、有向图强连通分量 1.有向图的弱连通与强连通 2.强连通分量 Kosaraju算法 Tarjan 算法&#xff08…...

数据库02_函数依赖,数据库范式,SQL语句关键字,数据库新技术---软考高级系统架构师009

1.首先我们来看这个,给定一个X,能确定一个Y那么就说,X确定Y,或者Y依赖x,那么 比如y = x * x 就是x确定y,或者y依赖于x 2.然后再来看图,那么左边的部分函数依赖,就是,通过A和B能决定C,那么如果A只用给就能决定C,那么就是部分函数依赖. 3.然后再来看,可以看到,A可以决定B,那么…...

王者荣耀入门技能树-解答

前言 前段时间写了一篇关于王者荣耀入门技能树的习题&#xff0c;今天来给大家解答一下。 职业 以下哪个不属于王者荣耀中的职业&#xff1a; 射手法师辅助亚瑟 这道题选&#xff1a;亚瑟 王者荣耀中有6大职业分类&#xff0c;分别是&#xff1a;坦克、战士、刺客、法师、…...

java基础学习 day37 (集合)

集合与数组的区别 长度&#xff1a;数组长度固定&#xff0c;一旦创建完成&#xff0c;就不能改变。集合长度可变&#xff0c;根据添加和删除元素&#xff0c;自动扩容或自动收缩&#xff0c;&#xff08;添加几个元素就扩容多少&#xff0c;删除几个元素就收缩多少&#xff0…...

C语言:数组

往期文章 C语言&#xff1a;初识C语言C语言&#xff1a;分支语句和循环语句C语言&#xff1a;函数 目录往期文章前言1. 一维数组的创建和初始化1.1 数组的创建1.2 数组的初始化2. 一维数组的使用3. 一维数组在内存中的存储4. 二维数组的创建和初始化4.1 二维数组的创建4.2 二维…...

斐波那契数列的--------5种算法(又称“兔子数列”)

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样一个数列&#xff1a;…...

【计算机网络(考研版)】第一站:计算机网络概述(二)

目录 四、OSI参考模型和TCP/IP模型 1.ISO/0SI参考模型 2.TCP/IP模型 3.OSI/RM参考模型和TCP/IP参考模型的区别和联系 4.五层教学模型 5.数据流动示意图 四、OSI参考模型和TCP/IP模型 前面我们已经讨论了体系结构的基木概念&#xff0c;在具体的实施中有两个重要的网络体系…...

Python内置包Tkinter的重要控件(下)

本文将接着介绍剩下的五个重要的控件&#xff0c;包括Canvas&#xff0c;Messagebox&#xff0c;Listbox&#xff0c;Checkbutton&#xff0c;Radiobutton。 目录 前言 控件 1. Canvas 2. Messagebox 3. Listbox 4. Radiobutton 5. Checkbutton 总结 前言 包括但不…...

(Java高级教程)第四章必备前端基础知识-第二节2:CSS属性

文章目录一&#xff1a;CSS属性一览表二&#xff1a;常用属性详解&#xff08;1&#xff09;字体属性&#xff08;2&#xff09;文本属性&#xff08;3&#xff09;背景属性一&#xff1a;CSS属性一览表 W3C&#xff1a;元素属性 A&#xff1a; align-content规定弹性容器内…...

听障人士亲述:我们在VRChat用手语交流,成员规模5000人

如果你在B站上搜索VRChat&#xff0c;排在前面的热门视频几乎都是与老外聊天的内容。除了练习语言、交文化流外&#xff0c;你还能在VRChat上遇到不少哇哇乱叫的小孩。作为一款VR社交应用&#xff0c;除了有趣的小游戏外&#xff0c;说话聊天也是VRChat关键的玩法之一。而有这么…...

设计一个70W在线人数的弹幕系统

背景&#xff1a; 直播业务中增加弹幕系统&#xff0c;支持单房间百万用户同时在线。 问题分析&#xff1a; 带宽压力&#xff1a; 假如说每3秒促达用户一次&#xff0c;那么每次内容至少需要有15条才能做到视觉无卡顿。15条弹幕http包头的大小将超过3k&#xff0c;那么每秒…...

一起自学SLAM算法:第9章-视觉SLAM系统

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 上一章介绍了以激光雷达做为数据输入的激光SLAM系统&#xff0c;激光雷达的优点在于数据稳定性好、测距精度高、扫描范围广&#xff0c;但缺点是价格昂贵、数据信息量低、安装部署位置不能有遮挡、雨天烟雾等环境…...

LeetCode 437. 路径总和 III

LeetCode 437. 路径总和 III 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff…...

LinuxC—高级IO

高级IO 1 非阻塞IO/有限状态机编程 1.1 基本概念 定义 有限状态机(Finite State Machine) 缩写为 FSM&#xff0c;状态机有 3 个组成部分&#xff1a;状态、事件、动作。 状态&#xff1a;所有可能存在的状态。包括当前状态和条件满足后要迁移的状态。事件&#xff1a;也称为…...

WebSocket 入门:简易聊天室

大家好&#xff0c;我是前端西瓜哥&#xff0c;今天我们用 WebSocket 来实现一个简单的聊天室。 WebSocket 是一个应用层协议&#xff0c;有点类似 HTTP。但和 HTTP 不一样的是&#xff0c;它支持真正的全双工&#xff0c;即不仅客户端可以主动发消息给服务端&#xff0c;服务…...

Windows10添加WebDav地址时报错“输入的文件夹无效,请选择另一个”

一、问题描述在使用Windows10添加WebDav网络地址时&#xff0c;报错“输入的文件夹无效&#xff0c;请选择另一个”&#xff0c;如下图所示&#xff1a;二、问题分析这是由于Windows10的WebDav默认只支持https协议&#xff0c;没有支持http协议导致的。三、解决办法3.1、修改注…...

Cadence PCB仿真使用Allegro PCB SI生成串扰总结报告Crosstalk Summary Report及报告导读图文教程

🏡《Cadence 开发合集目录》   🏡《Cadence PCB 仿真宝典目录》 目录 1,概述2,生成报告3,报告导读4,总结1,概述 Crosstalk Summary Report是各种串扰问题的一个简要总结报告。本文简单介绍使用Allegro PCB SI生成Crosstalk Summary Report报告的方法,及其要点导读。…...

【5-卷积神经网络】北京大学TensorFlow2.0

课程地址&#xff1a;【北京大学】Tensorflow2.0_哔哩哔哩_bilibiliPython3.7和TensorFlow2.1六讲&#xff1a;神经网络计算&#xff1a;神经网络的计算过程&#xff0c;搭建第一个神经网络模型神经网络优化&#xff1a;神经网络的优化方法&#xff0c;掌握学习率、激活函数、损…...

C++初阶:vector类

文章目录1 vector介绍2 实现vector2.1 类的定义2.2 默认成员函数2.2.1 构造函数2.2.2 析构函数2.2.3 拷贝构造2.2.4 赋值重载2.3访问接口2.4 容量接口2.5 修改接口2.5.1 尾插尾删2.5.2 任意位置插入2.5.3 任意位置删除2.6 其他接口1 vector介绍 1 vector是表示可变大小数组的序…...

机器学习中软投票和硬投票的不同含义和理解

设置一个场景&#xff0c;比如对于今天音乐会韩红会出现的概率三个人三个观点 A&#xff1a;韩红出现的概率为47% B&#xff1a;韩红出现的概率为57% C&#xff1a;韩红出现的概率为97% 软投票&#xff1a;软投票会认为韩红出现的概率为1/3*(47%57%97%)67% 硬投票&#xff1a;…...

Linux系统之网络客户端工具

Linux系统之网络客户端工具一、Links工具1.Links工具介绍2.安装Links软件3.Links工具的使用4.打印网页源码输出5.打印url版本到标准格式输出二、wget工具1.wget工具介绍2.安装wget软件3.wget工具的使用三、curl工具1.curl工具的介绍2.curl的常用参数3.curl的基本使用四、scp工具…...

c++函数(2)

这里写自定义目录标题默认参数函数重载递归函数变量周期默认参数 可为形参指定默认值&#xff0c;如果在函数调用时&#xff0c;没有指定与形参对应的实参时&#xff0c;就自动使用默认值。 默认参数可简化复杂函数的调用。 默认参数在函数名第一次出现在程序中指定&#xff0…...

HackTheBox Stocker API滥用,CVE-2020-24815获取用户shell,目录遍历提权

靶机地址&#xff1a; https://app.hackthebox.com/machines/Stocker枚举 使用nmap枚举靶机 nmap -sC -sV 10.10.11.196机子开放了22&#xff0c;80端口&#xff0c;我们本地解析一下这个域名 echo "10.10.11.196 stocker.htb" >> /etc/hosts 去浏览器访问…...

Java线程池应用实例

线程池的学习基本概念好处应用场景ThreadPoolExecutor实例理解&#xff1a;执行流程自定义线程池4大核心参数测试demo结论&#xff1a;ExecutorService常用方法思考获取ExecutorService代码示例ScheduleExecutorService常用获取方式如下ScheduledExecutorService常用方法如下:代…...

数字签名技术

介绍数字签名 数字签名是一种用于确认数据的完整性、确认发送者身份的技术。 签名主要包含两个过程&#xff1a;做摘要、进行非对称加密。 做摘要&#xff1a;签名者使用消息摘要算法对消息做摘要&#xff1b;进行非对称加密&#xff0c;得到签名值&#xff1a;签名者使用私…...

WPF-3D图形

WPF-3D图形 WPF的3D功能可以在不编写任何c#代码的情况下进行绘制&#xff0c;只需要使用xaml即可完成3D图形的渲染。本文主要讲述了WPF-3D中的关键概念&#xff0c; 以及常用到的命中测试、2d控件如何在3D对象中进行渲染&#xff0c;除此之外&#xff0c;还演示了如何导入外部…...

返回值的理解

前言 我们写的函数是怎么返回的&#xff0c;该如何返回一个临时变量&#xff0c;临时变量不是出栈就销毁了吗&#xff0c;为什么可以传递给调用方&#xff1f;返回对象的大小对使用的方式有影响吗&#xff1f;本文将带你探究这些问题&#xff0c;阅读本文需要对函数栈帧有一定…...

Hive,Presto,Spark 共性

Hive、Presto 和 Spark 都是大数据处理工具&#xff0c;都属于大数据处理技术栈&#xff0c;都需要集群环境支持&#xff0c;都可以进行数据处理和分析。 都可以进行数据处理&#xff1a;Hive、Presto、Spark 都可以用 SQL 语句进行数据处理&#xff0c;也可以用它们的语言&…...

Pytorch 学习路程 - 1:入门

目录 下载Pytorch 入门尝试 几种常见的Tensor Scalar Vector Matrix AutoGrad机制 线性回归尝试 使用hub模块 Pytorch是重要的人工智能深度学习框架。既然已经点进来&#xff0c;我们就详细的介绍一下啥是Pytorch PyTorch 希望将其代替 Numpy 来利用 GPUs 的威力&…...

vulfocus靶场tomcat-cve_2017_12615 文件上传

7.0.0-7.0.81 影响版本 Windows上的Apache Tomcat如果开启PUT方法(默认关闭)&#xff0c;则存在此漏洞&#xff0c;攻击者可以利用该漏洞上传JSP文件&#xff0c;从而导致远程代码执行。 Tomcat 是一个小型的轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多…...

jenkins搭建

安装jdk yum install -y java-1.8.0-openjdk.x86_64 默认安装到usr/lib/jvm目录下 查看JDK信息,输入命令:java -version 检测JDK安装包,输入命令:rpm -qa | grep java 进入安装目录。 输入命令:cd /usr/lib/jvm 删除Java相关文件,输入命令:rm -rf /usr/lib/jvm 配置…...

【ARMv9 DSU-120 系列 6 -- Power management】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 Power management In DSU-120Power DomainsPDTopPDClusterPDCore<cn>PDComplex<cpxn>PDSlice<slicen>PDL3RAM0 和 PDL3RAM1Cluster power mode在线模式(On)...

Oracle 21 C 安装详细操作手册,并配置客户端连接

Oracle 21 C 安装详细操作手册 Win 11 Oracle 21C 下载&#xff1a; Database Software Downloads | Oracle 中国 云盘共享 链接&#xff1a;https://pan.baidu.com/s/12XCilnFYyLFnSVoU_ShaSA 提取码&#xff1a;nfwc Oracle 21C 配置与登陆&#xff1a; 开始菜单 NetMa…...