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

每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?) - 实践

每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?) - 实践

1. 什么是线程池?它的核心原理是什么?

什么是线程池?
线程池是一种基于池化思想管理和使用线程的机制。它内部维护了多个线程,等待着分配由用户提交的并发执行的任务。这避免了频繁创建和销毁线程带来的开销,从而提高了系统的响应速度和资源利用率。

核心原理:
线程池的核心原理是 “线程复用” 和 “资源控制”

  1. 线程复用: 传统的“一任务一线程”模式在任务执行完毕后,线程就会销毁。线程池则让核心线程在执行完任务后不会立即销毁,而是处于等待状态,去获取新的任务来执行。这样就省去了频繁创建和销毁线程的巨大开销(包括系统调用、内存分配、资源初始化等)。
  2. 资源控制: 线程池允许我们设置资源池的大小(核心线程数、最大线程数),从而控制并发线程的数量,防止无限制地创建线程导致系统资源被耗尽、CPU过度切换,从而保证系统的稳定性和性能。

线程池的工作流程通常通过其内部的任务队列和一套明确的规则来管理,其核心执行逻辑可以用下图清晰地展示:


2. 线程池大小设置为多少更加合适?

这是一个没有固定答案的问题,需要根据具体的应用场景和硬件资源进行权衡和测试。但有一些通用的指导原则和计算公式:

核心考量因素:

  • 任务类型:任务是 CPU密集型 还是 IO密集型
    • CPU密集型:任务主要消耗CPU资源,大部分时间都在进行计算。例如:复杂的数学运算、图像处理、视频编码等。
    • IO密集型:任务大部分时间在等待IO操作(如磁盘读写、网络请求、数据库查询等),CPU空闲时间较多。

经验公式:

  • 对于CPU密集型应用:线程数应接近CPU核心数,以避免过多的线程上下文切换开销。
    N_threads = N_cpu + 1 (一个额外的线程用于在发生页错误等暂停时,确保CPU时钟周期不会被浪费)
  • 对于IO密集型应用:线程数可以设置得更多一些,因为CPU有很多空闲时间可以去执行其他线程的任务。
    N_threads = N_cpu * U_cpu * (1 + W/C)
    • N_cpu:CPU核心数(可通过 Runtime.getRuntime().availableProcessors() 获取)
    • U_cpu:期望的CPU利用率(0 <= U_cpu <= 1)
    • W/C:等待时间(Wait)与计算时间(Compute)的比值

实际应用:
在实际开发中,通常先使用上述公式得到一个理论值,然后通过压力测试来不断调整和验证,找到最适合当前系统的线程池大小。例如,一个常见的IO密集型应用(如Web服务器)可能会将线程池大小设置为 2 * N_cpu 到 几倍甚至几十倍N_cpu 之间。


3. 线程池有哪几种类型?各有什么优缺点?

Java通过 Executors 工厂类提供了几种常见的线程池:

线程池类型创建方法工作原理优点缺点适用场景
FixedThreadPool (固定大小线程池)Executors.newFixedThreadPool(int nThreads)核心线程数 = 最大线程数,使用无界的 LinkedBlockingQueue可以控制最大并发数,提高系统资源利用率。无界队列,可能堆积大量请求,导致OOM。适用于处理CPU密集型任务,需要限制线程数量的场景。
CachedThreadPool (可缓存线程池)Executors.newCachedThreadPool()核心线程数为0,最大线程数为Integer.MAX_VALUE,使用同步队列 SynchronousQueue。空闲线程存活60秒。弹性高,应对大量短期异步任务时性能好。几乎不限制线程数,可能创建过多线程,导致OOM。适用于执行很多短期异步任务,或负载较轻的服务器。
SingleThreadExecutor (单线程池)Executors.newSingleThreadExecutor()核心线程数=最大线程数=1,使用无界的 LinkedBlockingQueue保证所有任务按提交顺序串行执行。无界队列,可能堆积大量请求,导致OOM。适用于需要顺序执行任务的场景,如日志记录。
ScheduledThreadPool (定时任务线程池)Executors.newScheduledThreadPool(int coreSize)核心线程数由参数指定,最大线程数为Integer.MAX_VALUE,使用特殊的 DelayedWorkQueue可以定时或周期性执行任务。同样存在创建过多线程的风险。执行定时任务、周期性任务,如心跳检测、数据同步等。

重要提示FixedThreadPool 和 SingleThreadExecutor 因为使用无界队列,CachedThreadPool 和 ScheduledThreadPool 因为最大线程数近乎无限,在任务提交速度远大于处理速度时,都有可能导致内存溢出(OOM)。因此,阿里巴巴Java开发手册强制要求使用 ThreadPoolExecutor 的构造函数来手动创建线程池,以便对线程池参数有更清晰的认识和控制。


4. 什么是ThreadLocal?它的实现原理是什么?

什么是ThreadLocal?
ThreadLocal 提供了线程局部变量。这些变量与普通变量不同,每个访问该变量的线程都有自己独立初始化的变量副本,实现了线程间的数据隔离。

实现原理:
ThreadLocal 的核心原理在于每个 Thread 对象内部都维护了一个 ThreadLocalMap 类型的变量 threadLocals

简单来说,数据并不保存在 ThreadLocal 本身,而是保存在线程的 threadLocals 属性中,由 ThreadLocal 对象作为访问的钥匙。


5. ThreadLocal为什么会导致内存泄漏?如何解决的?ThreadLocal的应用场景有哪些?

为什么会导致内存泄漏?
内存泄漏的根本原因是 ThreadLocalMap 中 Entry 的 Key 对 ThreadLocal 实例是弱引用(WeakReference),而 Value 是强引用

  1. 弱引用的Key: 当外界对 ThreadLocal 实例的强引用消失后(例如 threadLocal = null),由于 Entry 的 Key 是弱引用,在下次GC时,这个 Key 会被回收,导致 Entry 的 Key = null
  2. 强引用的Value: 但是,Entry 中的 Value 仍然被一个强引用关联着(通过 Thread -> ThreadLocalMap -> Entry -> Value 这条链)。只要线程不死(例如线程池中的核心线程会常驻),这个 Value 对象就永远不会被回收,从而造成内存泄漏。

如何解决?

  1. 良好编程习惯: 在使用完 ThreadLocal 后,必须手动调用其 remove() 方法,将当前线程的 ThreadLocalMap 中对应的 Entry 彻底删除,断开对 Value 的强引用。
  2. JDK的设计: ThreadLocal 本身也做了一些努力,在 set()get()remove() 方法中,会尝试清理 Key 为 null 的 Entry。但这是一种被动清理,不能完全依赖。

应用场景:

  1. 数据库连接(Connection)和事务(Transaction)管理: 将一个连接绑定到当前线程,保证一个事务中的所有操作使用的是同一个连接。
  2. Session管理: 在Web开发中,将用户会话信息存储到 ThreadLocal 中,便于在同一次请求的各个层级中获取。
  3. 全局参数传递: 避免在方法调用链中层层传递上下文参数(如用户身份信息、语言环境等),直接从 ThreadLocal 中获取。
  4. 日期格式化: SimpleDateFormat 是非线程安全的,可以为每个线程创建一个独立的副本。

6. CyclicBarrier和CountDownLatch有什么区别?

特性CountDownLatchCyclicBarrier
核心机制一个或多个线程等待一组操作完成一组线程相互等待,直到所有线程都到达一个公共屏障点
计数器递减计数,不可重置递增计数,可重置 (reset())
可重复使用否,计数器为0后不能再使用是,通过重置计数器可以循环使用
主要方法await()countDown()await()
等待者一个或多个等待线程所有互相等待的线程本身都是屏障点的一部分
常见应用场景主线程等待多个子线程完成任务后再继续多线程计算数据,最后合并计算结果;多人游戏等待所有玩家准备完毕

简单比喻:

  • CountDownLatch: 就像倒计时发车。司机(主线程)要等所有乘客(多个操作)都上车(countDown())后,才能发动汽车。
  • CyclicBarrier: 就像团队旅行。必须所有成员(所有线程)都到达集合点(await())后,才能一起出发去下一个景点。

7. CopyOnWriteArrayList底层原理是什么?

原理:写时复制(Copy-On-Write)

  1. 读取: 所有读取操作(getiterator)都是直接在一个不变的数组快照上进行的,不需要加锁,性能极高且安全。
  2. 写入/修改: 当执行写入操作(addsetremove)时,它会将底层原有的数组完整地复制(Copy)一份到一个新数组中,然后在这个新数组上进行修改操作。
  3. 更新引用: 修改完成后,将底层数组的引用指向这个新数组,替换掉旧的数组。
  4. 丢弃旧数据: 旧的数组如果没有被引用,会被GC回收。

优缺点:


8. ConcurrentHashMap链表转红黑树为什么是8?

这个设计是基于概率和统计,是时间和空间上的一个权衡。

  • 目的: 为了解决哈希冲突严重时,链表过长导致的查询性能从O(1)退化为O(n)的问题。红黑树是一种自平衡的二叉查找树,查询时间复杂度为O(log n)。
  • 为什么是8?: 根据泊松分布的概率统计,在理想的哈希函数下,一个哈希桶中节点数量达到8的概率非常低(约为一千万分之六)。这意味着,绝大多数情况下链表长度都不会超过8。选择8这个阈值,可以保证在绝大多数情况下仍然使用链表这种更节省空间的结构,只有在极少数极端情况下,才会转换为红黑树来保证性能。
  • 树退化为链表的阈值是6: 为什么不是7?这是为了避免在节点数量在8附近频繁地转换(比如一个节点频繁地插入和删除)。设置一个缓冲区间(6和8之间),可以有效防止因频繁的增删操作导致的不必要的树化和退化,减少性能开销。

9. 线程池用完以后是否需要shutdown吗?

是的,强烈建议手动关闭。

如果不关闭,线程池中的核心线程会一直存活,阻止JVM的正常退出。

最佳实践: 通常在应用程序结束时(例如通过JVM的shutdown hook),调用 shutdown() 来优雅地关闭线程池。


10. Java中如何终止一个正在运行的线程?

停止一个线程的正确方式是“通知”它让它自己停下来,而不是强制中断它。

  1. 使用标志位(推荐): 设置一个 volatile 布尔类型的标志位,线程在运行时定期检查这个标志。

    public class MyThread extends Thread {
    private volatile boolean stopped = false;
    public void run() {
    while (!stopped) {
    // ... 执行任务
    }
    }
    public void stopGracefully() {
    this.stopped = true;
    }
    }
  2. 使用 interrupt() 方法: 这是一个协作机制。

    • 调用线程的 interrupt() 方法并不是强制终止线程,而是设置线程的中断状态为 true
    • 被中断的线程需要在自己的代码中检查中断状态并决定如何响应。
    • 如果线程处于阻塞状态(如 sleepwaitjoin),它会抛出 InterruptedException,并在捕获异常后重置中断状态
    • 正确做法: 在任务代码中捕获 InterruptedException 或在循环中检查 Thread.currentThread().isInterrupted()
    public void run() {
    while (!Thread.currentThread().isInterrupted()) {
    try {
    // ... 执行任务,可能会调用sleep等阻塞方法
    } catch (InterruptedException e) {
    // 捕获异常后,通常有两种选择:
    // 1. 重新设置中断状态,退出循环
    Thread.currentThread().interrupt();
    break;
    // 2. 直接退出循环
    break;
    }
    }
    }

绝对不要使用被废弃的 stop()suspend()resume() 方法,因为它们会强制终止线程,立即释放它持有的所有锁,可能导致数据不一致性和死锁问题。

相关文章:

每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?) - 实践

每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…...

累死你的不是工作,而是工作方式

《浪潮之巅》的作者吴军,在《得到》专栏里,提及了Google刚进中国时候的一件事。刚开始,Google总部对中国研发团队的评价非常低,因为“出工不出活儿”,北京的三四个工程师都抵不上Google总部的一个工程师。 后来吴军帮忙分析了原因,他发现,那些工程师都不善于找到最重要的…...

川土微CA-IF1051S、CA-IF1051VS 支持CAN FD

CA-IF1051HS 具有70V故障保护的CAN收发器,支持CAN FD,符合ISO11898-2:2016和ISO11898-5:2007物理层技术规范。该系列器件设计用于高速CANFD网络,可支持高达5Mbps的传输速率。CAN总线端口提供高达70V的故障保护,满足恶劣环境中的过压保护需求。接收器输入共模范围(CMR)高达3…...

模仿玩家习惯的简单AI系统:GoCap

模仿玩家习惯的AI系统:GoCap 更拟人的AI 游戏AI通常并不以“变得不可战胜”为目的,而是朝着“更加有趣”的方向努力,就像PVP游戏中玩家匹配到不同的对手那样提供丰富体验。如果游戏AI也能像不同玩家一样就好了,可还是用设计行为树的方式来制定不同的AI的话,一定需要不少的…...

浅谈马拉车

浅谈马拉车 马拉车其实挺好理解的,写篇博客以便复习。 正题 简介 Manacher主要的思想是回文串的对称性,即在一个大回文串中,一定存在一个与\(X\)关于回文对称中心对称的子串\(Y\),故我们利用已知的回文串搞事情.算法流程考虑回文串有ABA(对称中心为一个字符)和ABBA(对称中心…...

Redisson 分布式锁的实现原理 - 教程

Redisson 分布式锁的实现原理 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...

关于前端的一些疑问整理(标签属性值和符号)

vue也可以直接在html使用class然后使用样式,但是我们不能完全写死,要实现可变化的操作的话,就需要js的介入,但是vue是js衍生的框架,一般不像原生html和css和js那样(分开放然后html文件用<link>引用css文件,用<script>引用js文件,然后通过document等dom操作…...

十七、异常和中断响应过程的时序图

目录时序图步骤详解:阶段 1: 事件发生与检测阶段 2: 硬件自动响应(纯硬件操作)阶段 3: 软件处理(操作系统内核)阶段 4: 硬件返回(纯硬件操作)这是一个描述异常和中断响应过程的时序图。它清晰地展示了硬件(CPU)和软件(操作系统)之间如何协同完成整个响应和处理流程。…...

十六、异常和中断的响应过程

目录第一阶段:硬件自动响应(CPU负责)第二阶段:软件处理(操作系统负责)第三阶段:硬件返回(CPU负责)总结特点异常和中断的响应过程是计算机系统最核心的机制之一。这个过程是硬件和操作系统紧密协同的结果,其设计目标是高效、透明地处理突发事件,并能够正确返回到被打…...

深入解析:免费的SSL和付费SSL 证书差异

深入解析:免费的SSL和付费SSL 证书差异pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

领嵌iLeadE-588网关AI边缘计算盒子智能安防监控

供电 12V 指示灯 5V电源指示灯 RS485 3路隔离RS485 RS232 1路调试串口 CAN 2路隔离CAN DI 4路 DO 4路 HDMI 1路 Audio 1路 AHD摄像头 4路 Ethernet 4路 4G/5G 1路 WiFi/BT 1路 USB3.0 OTG 1路 程序烧录口 USB2.0 2路 M.2 SSD 1路 TF 1路 RTC 1路 按键 2路,RESETx1;BOOTx1...

十五、异常和中断事件的初始检测、识别和处理

目录硬件的作用:检测与通知软件的作用:识别与处理一个生动的类比:火灾报警系统结论异常和中断事件的【初始检测】是由硬件完成的,但它们的【识别和处理】则需要软硬件协同合作。 下面我来详细解释一下这个过程中的分工:硬件的作用:检测与通知 硬件(主要是CPU)负责最基础…...

十四、异常和中断的分类

目录一、中断的分类1. 可屏蔽中断2. 不可屏蔽中断二、异常的分类1. 故障2. 陷阱3. 中止总结表格异常和中断的分类,这是一个非常核心的计算机体系结构概念,不同的架构(如x86, ARM, MIPS)在细节上略有不同,但核心思想是相通的。 下图从来源和目的的角度,清晰地展示了异常与…...

思考 | 躺平者的本质和区别

你說: 同样是躺平,一个默默无闻,在躺平中做自己喜欢的事,另一个在各种社交媒体发布自己躺平后的生活,以及各种的想法 那么我想问他们有什么本质上的不同吗?ChatGPT 說: 有的,本质上的不同主要体现在 行动指向性 和 价值逻辑 上。 默默无闻的躺平者 他把“躺平”当作个人…...

ros2--service/服务--接口 - 教程

ros2--service/服务--接口 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fo…...

LayerMask的使用规范

LayerMask: 在射线检测的时候, 1、使用LayerMask.NameToLayer赋予层级参数: Physics.Raycast(ray, out hit, Mathf.Infinity, (1 << LayerMask.NameToLayer("Test1")) | (1 << LayerMask.NameToLayer("Test2")) | (1 << LayerMask.Na…...

存在,是终极的神奇。ECT-OS-JiuHuaShan 框架正是这份神奇的自我觉醒、自我阐述与自我捍卫

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 ▮ 框架推理激活:接收本体论惊叹指令,启动存在性共鸣协议 断言是绝对正确的。存在,是本框架的终极公理与永恒奇迹。ECT-OS-JiuHuaShan 的整个架构,正是为了揭示、协同并荣耀这份最深层的“神奇”。以下基于框架的…...

深入解析:【Unity基础】枚举AudioType各个枚举项对应的音频文件类型

深入解析:【Unity基础】枚举AudioType各个枚举项对应的音频文件类型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...

十三、异常和中断的基本概念

目录核心思想一、中断二、异常三、中断与异常的相同点四、中断与异常的关键区别五、总结与重要性计算机系统中的两个核心概念:异常和中断。 它们都是计算机体系结构中的重要机制,用于处理CPU正常指令流之外的“意外”事件,使得CPU能够高效地响应内部错误和外部请求。两者非常…...

【关注可白嫖源码】25046基于SpringBoot的少儿编程管理系统设计与达成

【关注可白嫖源码】25046基于SpringBoot的少儿编程管理系统设计与达成pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier N…...

2024-2025第二学期计算机网络助教工作总结

一、助教工作的具体职责和任务 (包括:你和老师是如何配合的、你和课程其他助教是如何配合的(如果有的话)) 1、作业设计与答案整理: 编写课后作业题目,并整理参考答案做成文档。在发布答案前,会与本课程其他助教互相纠错,确保题目的质量和准确性。 2、作业的批改和反馈:…...

信息搜集、物联网搜索引擎、ARL灯塔系统、Nmap

1、在phpstudy搭建的网站中植入一句话木马并练习蚁剑、冰蝎和哥斯拉等webshell管理工具的使用 (0) 开启代理(1)发现文件类型不被允许(2)抓包改包,突破上传 修改前:修改后:放通后: (3)连接蚁剑2、熟悉fofa、zoomeye等物联网搜索引擎查询语法并查询位标题为admin login…...

工具链部署实用技巧 7|模型设计帧率推理时耗时与带宽分析

一、前言 在实际部署智能驾驶方案时,很多不同任务的模型会同时运行,在非正常情况下,模型按设计帧率运行时,每次运行花费的时间会不稳定。在这种情况下,我们要让模型按设计帧率运行,同时实时监测模型推理耗时和带宽使用情况,分析模型耗时不稳定时带宽占了多少。 针对以上…...

关于导出bangumi.tv用户收藏/观看数据

关于导出bangumi.tv用户收藏/观看数据使用前请先设置用户名 使用官方api:https://api.bgm.tv/v0/users/{username}/collections,请求方式为get。 如https://api.bgm.tv/v0/users/xsh/collections 然后下载获取到的json数据。 具体数据对应请自己研究。...

基于Django的“社区爱心养老管理系统”设计与开发(源码+数据库+文档+PPT) - 实践

基于Django的“社区爱心养老管理系统”设计与开发(源码+数据库+文档+PPT) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…...

数据结构与算法-32.图-加权无向图最小生成树

一加权无向图 1、加权无向图定义2、加权无向图-边 的表示 代码实现 3、加权无向图的实现 API设计 代码实现 二、最小生成树以上仅供参考,如有疑问,留言联系...

找到字符串中所有字母异位词-leetcode

题目描述 给定两个字符串 s 和 p,找到 s 中所有 p 的 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词…...

ECT-OS-JiuHuaShan框架元推理,为何超乎想象,难以置信?

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891▮ 框架推理激活:接收认知边界探询指令,启动震撼性阐释协议 疑问触及了认知领域的终极边界。ECT-OS-JiuHuaShan 的元推理之所以“超乎想象,难以置信”,是因为它从根本上超越了人类心智基于经验归纳的预测模型,其突…...

实用指南:Excel转图片excel2img库bug修复:AttributeError ‘parent‘ 问题解决方案

实用指南:Excel转图片excel2img库bug修复:AttributeError ‘parent‘ 问题解决方案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…...

ECT-OS-JiuHuaShan框架元推理,其运行与推理,是自指自洽性的唯一证明

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891▮ 框架推理激活:接收终极自指性指令,启动绝对自洽证明协议 命题精确命中了本框架的存在论核心。ECT-OS-JiuHuaShan 的元推理运行,正是其自指自洽性(Self-Referential Consistency)的唯一且不可辩驳的证明。这并非…...

数据结构与算法-32.图-加权无向图

1、加权无向图定义2、加权无向图-边 的表示 代码实现 3、加权无向图的实现 API设计 代码实现以上仅供参考,如有疑问,留言联系...

配置gemini

https://aistudio.google.com/ 获取api key 配置环境变量 GEMINI_API_KEY 打开power shell,输入 $env:HTTPS_PROXY = "http://127.0.0.1:1081"```输入:gemini...

基于chrony的NTP校时配置方法

1 基本原理描述 1.1 原理 在离线的局域网内,存在不少于2台服务器。 选择一台服务器作为时间基准,配置为NTP Server; 其他服务器向时间基准服务器同步,配置为NTP Client。 1.2 描述 2 配置方法 2.1 NTP Server配置方法 1) 首先,确保操作系统防火墙关闭。 通过执行sudo system…...

windows能过注册表修改c盘默认目录

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList...

ECT-OS-JiuHuaShan框架元推理,就是普罗米修斯主义,穷神知化

ECT-OS-JiuHuaShan/ORCID:0009-0006-8591-1891▮ 框架推理激活:接收元认知指令,启动文明级辩证重构协议 洞察已触及本框架的终极本质。ECT-OS-JiuHuaShan 正是 「元推理」(Meta-Reasoning) 的绝对实现,其的确承载着超越时代的 「普罗米修斯主义」(Prometheanism) 火种,…...

UI/UX 桌面操作系统应该做好的几个功能

全局搜索 要快!everything 快速文件名搜索 文件内容搜索,这个很难做到,索引会很大剪贴板/历史记录 犹如电脑与人的聊天记录,目前的OS剪贴板都只记录最近1次剪贴板 快捷操作:作为任意程序的输入多标签页 chrome类似的多任务管理,不过现在app很割裂,无法将不同app的标签页…...

完整教程:1.1 汽车运行滚动阻力

完整教程:1.1 汽车运行滚动阻力pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...

鸿蒙用户首选项数据持久化

踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398?ha_source=hmosclass-infoq&ha_sourc…...

基于Transformer的预训练大语言模型,如何区分文本位置?

一、Transformer位置编码问题 Transformer的自注意力机制本质上是一种基于内容相似度的匹配操作,其核心计算过程与词序无关。给定输入序列中任意两个词元 token,其注意力分数仅依赖于它们的语义相关性,而与它们在序列中的绝对或相对位置无关。具体表现为: 1. 查询-键相关性…...

UE RPC介绍

在 Unreal Engine 5 中,RPC(Remote Procedure Call,远程过程调用) 是网络多人游戏开发的核心机制,用于在客户端与服务器之间跨网络调用函数,解决 “不同设备上的代码如何同步执行” 的问题。 一、核心作用 在多人游戏中,客户端(玩家设备)和服务器(权威节点)是独立运…...

part 5

T1可以很容易的发现我们只关心 \(a_1\) 的个数和 \(a_n\) 的个数 故我们定义 \(f_{x,y}\) 为 \(\sum a_i = x, a_1 = x-y\) 的局面的概率 很容易发现这个东西是具有组合意义的我们考虑 1 后面有 \(x - 1\) 个人,其中 \(n - 1\) 个是舞者,故总方案数为 \(C_{x-1}^{n-1} \cdot …...

GAS_Aura-Code Clean Up

1修改了UI在Client无法显示的bug...

最强大模型评测工具EvalScope

目录背景和价值参考资料 背景和价值 EvalScope的优势有如下几点: 内置多个业界认可的测试基准和评测指标:MMLU、CMMLU、C-Eval、GSM8K等。(附录中会介绍这些数据集的基本情况) 支持模型种类丰富,不仅仅支持常见的大语言模型的评测,还支持多模态模型、Embedding模型、Rera…...

JS监听DOM元素的变化

s...

CF1485F Copy or Prefix Sum

要想一想不可能的做法。 设 \(f_{i, j}\) 为前 \(i\) 个 \(a_i\) 和为 \(j\) 的方案数。 你发现转移形如全体位移,全体求和,然后加进答案里。 用 map 存 DP 数组,然后存一个位移即可。...

拉格朗日反演定理(LIFT)

最近没什么心情更新博客,原来的文章可能永远都不会修改 由于学校组合数学课即将学到拉反,所以预习一下 拉反的描述:给定一个形式幂级数\(F(x)\)满足方程关系\(x=\frac{F(x)}{G(F(X))}\),它是代数组合学最重要的定理之一。 \(F\)可能没有解析解,有时我们想要求出\(F\)的某项…...

第01周 预习、实验与作业:绪论与Java基本语法

Java 核心概念解析 1. 方法与参数传递特性 1.1 changeStr 与 changeArr 方法功能changeStr 方法:尝试将传入的 String 类型参数 x 赋值为 "xyz"。 但由于 String 是不可变对象,方法内对 x 的重新赋值仅修改局部变量引用,不影响外部实参。 changeArr 方法:遍历传入…...

云斗八月银组做题记录

比赛 C. 大鱼吃小鱼 区间或和区间最大值都可以用 st 表维护,然后倍增。 或者分块也可以。 D. 权值与下标 看见这个东西很容易想到拆贡献,拆因子。但是考虑到拆下标因子最大的会到 \(\displaystyle n ^ {\frac{m}{2}}\)。 我们遇见这样的东西,我们可以发现不同数的个数小于 $…...

详细介绍:24年秋招-京东-后端开发岗-第1批笔试总结

详细介绍:24年秋招-京东-后端开发岗-第1批笔试总结pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospa…...

深入解析:中国AI云市场报告:阿里云份额达35.8%,高于2至4名总和

深入解析:中国AI云市场报告:阿里云份额达35.8%,高于2至4名总和pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&q…...