<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[huachangzai的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/huachangzai</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; huachangzai]]></copyright><item><title><![CDATA[深入解析JAVA虚拟线程]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/152256922</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/152256922</guid><author>huachangzai</author><pubDate>Mon, 13 Oct 2025 18:20:52 +0800</pubDate><description><![CDATA[本文深入探讨了JDK21引入的虚拟线程技术，通过修改JVM和基础类库实现百万级IO密集型并发。虚拟线程采用Continuation机制，在阻塞时保存栈帧并释放平台线程，恢复执行时重新装载栈帧，保持阻塞式编程习惯不变。文章分析了Continuation和VirtualThread核心类的工作原理，以及虚拟线程对ThreadLocal、Sleep()和OkHttp等场景的影响。相比传统线程，虚拟线程内存占用更低（约2KB），支持海量并发，且无需修改现有代码。]]></description><category></category></item><item><title><![CDATA[ByteBuffer 中 position 的含义]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/146103996</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/146103996</guid><author>huachangzai</author><pubDate>Fri, 07 Mar 2025 20:07:21 +0800</pubDate><description><![CDATA[是一个非常重要的概念，它代表当前。会变为 2，意味着接下来将会写入。从 0 开始，经过两次。]]></description><category></category></item><item><title><![CDATA[如何在 WebSocketHandler 中控制连接的断开]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/146043156</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/146043156</guid><author>huachangzai</author><pubDate>Wed, 05 Mar 2025 14:48:40 +0800</pubDate><description><![CDATA[返回的Mono<Void>和返回的Mono<Void>是同一个概念，它们表示 WebSocket 连接的生命周期。只有在连接关闭时，这些Mono才会完成。通过Mono<Void>和，你可以灵活地控制 WebSocket 连接的打开、消息的发送与接收，以及连接的关闭。]]></description><category></category></item><item><title><![CDATA[Spring Boot WebFlux 中 WebSocket 生命周期解析]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/146042718</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/146042718</guid><author>huachangzai</author><pubDate>Wed, 05 Mar 2025 14:36:58 +0800</pubDate><description><![CDATA[阶段说明连接建立客户端发起 WebSocket 连接请求，服务器接受并返回 101 Switching Protocols 响应，连接建立。消息传输服务器和客户端可以双向传输文本或二进制消息。连接关闭连接可由客户端、服务器、网络异常等原因关闭。资源清理连接关闭后需要进行资源清理操作，如取消订阅、清理状态等。我们还可以通过")));]]></description><category></category></item><item><title><![CDATA[Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/146018343</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/146018343</guid><author>huachangzai</author><pubDate>Tue, 04 Mar 2025 16:05:34 +0800</pubDate><description><![CDATA[在 Spring WebFlux 中使用和DataBuffer避免重复读取DataBuffer，建议在读取后缓存数据。避免阻塞操作，尽量使用FluxMono进行异步处理。防止内存泄漏，在手动管理DataBuffer生命周期时使用释放资源。确保DataBuffer只在最终消费时释放，避免Flux流程中数据丢失。]]></description><category></category></item><item><title><![CDATA[doOnNext() vs flatMap()：区别与适用场景]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/145997516</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/145997516</guid><author>huachangzai</author><pubDate>Mon, 03 Mar 2025 19:49:07 +0800</pubDate><description><![CDATA[都可以用来处理流中的元素，但它们有不同的作用和适用场景。，确保它的逻辑执行完成后才继续。在 Reactor（]]></description><category></category></item><item><title><![CDATA[Spring WebFlux WebSocket 连接保持策略]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/145997196</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/145997196</guid><author>huachangzai</author><pubDate>Mon, 03 Mar 2025 19:37:49 +0800</pubDate><description><![CDATA[在 Spring WebFlux 的 WebSocket 处理器 (`WebSocketHandler`) 中，`handle(WebSocketSession session)` 方法用于管理 WebSocket 连接。其返回的 `Mono<Void>` 表示 WebSocket 处理的生命周期，`Mono` 终止时，WebSocket 连接将被关闭，`WebSocketSession` 也会释放资源。  
由于 `session.receive()` 是 `Flux`，它本身不会结束，但 `sessio]]></description><category></category></item><item><title><![CDATA[线程池中的四种队列类型及其对线程池配置的影响]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/145887504</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/145887504</guid><author>huachangzai</author><pubDate>Wed, 26 Feb 2025 20:17:54 +0800</pubDate><description><![CDATA[队列类型队列容量核心线程数的变化最大线程数的变化无界队列（无限制核心线程数会保持在，只有在负载过高时会创建新线程。线程池可以创建新线程，直到达到。如果达到最大线程数，任务会根据拒绝策略处理。有界队列（有限容量如果核心线程空闲，任务将由核心线程处理。队列已满时不会创建新线程，任务会阻塞。线程池会创建新线程直到达到，如果达到最大线程数，新的任务会根据拒绝策略处理。优先级队列（无限制与其他队列相同，核心线程数会在负载过高时创建。线程池会创建新线程直到达到，并且新任务的优先级会影响处理顺序。]]></description><category></category></item><item><title><![CDATA[深入理解 Spring 中的 `ThreadPoolTaskExecutor` 与 `ThreadPoolExecutor`]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/145887006</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/145887006</guid><author>huachangzai</author><pubDate>Wed, 26 Feb 2025 19:46:52 +0800</pubDate><description><![CDATA[尽管。]]></description><category></category></item><item><title><![CDATA[深入理解 `Sinks.Empty＜Void＞` 和 `Mono＜Void＞`：如何触发完成信号并结合 WebSocket 示例]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/145861356</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/145861356</guid><author>huachangzai</author><pubDate>Tue, 25 Feb 2025 20:02:50 +0800</pubDate><description><![CDATA[是一个手动控制的信号源，它不会自动发出完成信号，必须通过显式调用来触发。Mono<Void>表示一个不发射数据的异步序列，它只会发出完成或错误信号。WebSocket 连接示例通过和Mono<Void>，可以灵活地表示 WebSocket 连接的完成状态。在连接关闭或发生错误时，手动触发完成或错误信号。通过和Mono<Void>，我们可以灵活地控制异步操作的完成信号。结合 WebSocket 示例，展示了如何在实际场景中使用这些工具。关键在于理解的初始状态是未完成的，必须通过显式调用或。]]></description><category></category></item><item><title><![CDATA[Project Reactor中 map、flatMap、concatMap 和 flatMapSequential 的区别]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/145858326</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/145858326</guid><author>huachangzai</author><pubDate>Tue, 25 Feb 2025 17:31:39 +0800</pubDate><description><![CDATA[（Reactive Streams 的实现库，常用于 Spring WebFlux）中，是常用的操作符，但它们的功能和行为有显著区别。根据你的需求选择合适的操作符。如果有更多问题，欢迎继续提问！]]></description><category></category></item><item><title><![CDATA[Stream 的使用和基本原理]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/143366743</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/143366743</guid><author>huachangzai</author><pubDate>Wed, 30 Oct 2024 16:03:39 +0800</pubDate><description><![CDATA[Stream将要处理的元素集合看作一种流，在流的过程中，借助Stream API对流中的元素进行操作，比如：筛选、排序、聚合等。接下来正式进入主题，首先介绍一些重要接口参考：浅谈 jdk 中的 Stream 流使用及原理]列举了相关的接口以及有流程图Java 8 Stream流底层原理]列举了常用操作的sink代码，还有总的执行流程图，深得我心。]]></description><category></category></item><item><title><![CDATA[ForkJoinPool简介]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/143337775</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/143337775</guid><author>huachangzai</author><pubDate>Wed, 30 Oct 2024 15:19:31 +0800</pubDate><description><![CDATA[（2023年3月公司内部分享）本文是主要基于以下三篇文章摘录和整理，屏蔽了一些细节，主要讲基本原理和任务处理流程，具体细节可以先看原文：ForkJoinPool大型图文现场（一阅到底 vs 直接收藏）（上）ForkJoinPool大型图文现场（一阅到底 vs 直接收藏）（中）ForkJoinPool大型图文现场（一阅到底 vs 直接收藏）（下）在计算机科学中，分治法是一种很重要的算法。字面上的解释是「分而治之」，就是把一个复杂的问题分成两个或更多的相同或相似的子问题，再把子问题分成更小的子问题……直到最后子]]></description><category></category></item><item><title><![CDATA[从内部类到Lambda表达式]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/143337172</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/143337172</guid><author>huachangzai</author><pubDate>Tue, 29 Oct 2024 18:19:09 +0800</pubDate><description><![CDATA[内部类->匿名内部类->Lambda表达式-> 方法引用，代码越来越简洁，同时也越来越抽象，越抽象越变化多端。但是万变不离其宗，在编译时或者运行时还是会生成对应的类。掌握其原理并且灵活使用，可以让我们的代码更加优雅，在看源码的时候也更加从容。以上内容只是介绍了一些基本原理，在实际应用过程中，Lambda表达式结合接口和泛型的使用，可以使得简单的代码就可以面对变化多端的需求，这个可以在Stream源码中体会。]]></description><category></category></item><item><title><![CDATA[Java常用任务调度]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/123393114</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/123393114</guid><author>huachangzai</author><pubDate>Tue, 29 Oct 2024 17:23:58 +0800</pubDate><description><![CDATA[在日常开发过程中，我们经常会遇到周期性执行某段代码的场景。比如定期同步订单，定期更新商品信息，定期发送消息等。这些重复执行的代码可以抽象为一个任务(Task)。 一个Task的特点如下：围绕Task的特点，开发者们开发了不同的调度框架或者中间件，满足日常开发中的使用。以下表格列出了部分实现。本文对部分技术的实现进行了介绍，从简单到复杂，从具体到抽象，希望可以让大家在面对一个任务调度框架时可以快速抓住要点，不再陌生。java.util.Timer位于JDK的rt.jar包下，始于jdk1.3，是JDK自带的任]]></description><category></category></item><item><title><![CDATA[使用 EasyOCR 识别 PDF 中的文字]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/141251545</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/141251545</guid><author>huachangzai</author><pubDate>Fri, 16 Aug 2024 10:26:14 +0800</pubDate><description><![CDATA[在读取PDF上文字的时候，发现有些pdf是图片格式的，常规的pdf库是提取不到的。因此考虑使用OCR进行提取。]]></description><category></category></item><item><title><![CDATA[macOS上运行 Ollama & AnythingLLM，打造自己的桌面智能体/知识库。]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/138605812</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/138605812</guid><author>huachangzai</author><pubDate>Thu, 09 May 2024 16:56:53 +0800</pubDate><description><![CDATA[如果你不想通过命令行来使用Ollama，可以搭配一些界面来用。比如AnythingLLM。但是我发现，如果只是体验一下，没有必要使用doker这么麻烦的方式使用。比如我是macOs系统，apple芯片，就选了第一个安装。已经开发了多种系统的桌面端，直接下载使用即可。其他使用步骤与docker没区别，直接参考。下载安装Ollama可以参考前序文章。]]></description><category></category></item><item><title><![CDATA[ubuntu 本地部署体验Llama3的中文微调模型Llama3-Chinese-8B-Instruct]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/138531693</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/138531693</guid><author>huachangzai</author><pubDate>Thu, 09 May 2024 10:02:47 +0800</pubDate><description><![CDATA[ubuntu 本地部署体验Llama3的中文微调模型Llama3-Chinese-8B-Instruct]]></description><category></category></item><item><title><![CDATA[Ubuntu 环境安装和使用Ollama]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/138523773</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/138523773</guid><author>huachangzai</author><pubDate>Tue, 07 May 2024 12:19:05 +0800</pubDate><description><![CDATA[Ubuntu 环境安装和使用Ollama]]></description><category></category></item><item><title><![CDATA[macOS 本地部署体验Llama3]]></title><link>https://blog.youkuaiyun.com/huachangzai/article/details/138521675</link><guid>https://blog.youkuaiyun.com/huachangzai/article/details/138521675</guid><author>huachangzai</author><pubDate>Tue, 07 May 2024 10:50:18 +0800</pubDate><description><![CDATA[打开终端，输入命令 ：ollama run llama3。即可启动llama3。如果第一次启动，会先下载模型。ollama run llama3下载的是8b模型。很明显，现在官方的llama3对中文的支持不是很好，所以现在也已经有人针对中文进行了训练，可以更好支持中文。点击模型名称后，可以看到模型的具体信息。选择不同的模型，右边会给出相对应的命令。使用Ollama本地部署非常容易，首先下载Ollama。ollama list: 查看已经下载的模型。查看Ollama 已经支持的模型。下载完成后正常安装。]]></description><category></category></item></channel></rss>