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

Java进阶版线程池(超详细 )

线程池 

线程池工具类  Executors 

Executors 是 Java 提供的一个工具类,它包含了多个静态方法,能够方便地创建不同类型的线程池。        

newFixedThreadPool

创建一个固定大小的线程池,线程池中的线程数量固定,当有新任务提交时,如果线程池中有空闲线程,则立即执行任务;如果没有空闲线程,则将任务放入工作队列等待。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class FixedThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小为 3 的线程池ExecutorService executor = Executors.newFixedThreadPool(3);for (int i = 0; i < 5; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is being executed by " + Thread.currentThread().getName());});}executor.shutdown();}
}
newSingleThreadExecutor

创建一个单线程的线程池,线程池只有一个线程,所有任务按顺序依次执行。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class SingleThreadExecutorExample {public static void main(String[] args) {// 创建一个单线程的线程池ExecutorService executor = Executors.newSingleThreadExecutor();for (int i = 0; i < 5; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is being executed by " + Thread.currentThread().getName());});}executor.shutdown();}
}
 newCachedThreadPool

创建一个可缓存的线程池,线程池的线程数量不固定,当有新任务提交时,如果线程池中有空闲线程,则立即执行任务;如果没有空闲线程,则创建新线程来执行任务。当线程空闲时间超过 60 秒时,会被销毁。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CachedThreadPoolExample {public static void main(String[] args) {// 创建一个可缓存的线程池ExecutorService executor = Executors.newCachedThreadPool();for (int i = 0; i < 5; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is being executed by " + Thread.currentThread().getName());});}executor.shutdown();}
}
newScheduledThreadPool

创建一个支持定时和周期性任务执行的线程池。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledThreadPoolExample {public static void main(String[] args) {// 创建一个大小为 2 的定时线程池ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);// 延迟 2 秒后执行任务executor.schedule(() -> System.out.println("Scheduled task executed"), 2, TimeUnit.SECONDS);// 延迟 1 秒后开始,每 3 秒执行一次任务executor.scheduleAtFixedRate(() -> System.out.println("Periodic task executed"), 1, 3, TimeUnit.SECONDS);executor.shutdown();}
}

自定义线程池:ThreadPoolExecutor 

常用构造函数如下:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)

参数含义如下:

  1. corePoolSize:核心线程数。线程池会保持这些线程一直存活,即便它们处于空闲状态。当有新任务提交时,若线程池里的线程数量少于 corePoolSize,就会创建新线程来处理任务。
  2. maximumPoolSize:线程池允许的最大线程数。当工作队列已满,并且线程池中的线程数量小于 maximumPoolSize 时,会创建新线程来处理任务。
  3. keepAliveTime:线程空闲时的存活时间。当线程池中的线程数量超过 corePoolSize,且这些多余的线程空闲时间达到 keepAliveTime 时,它们会被销毁。
  4. unitkeepAliveTime 的时间单位,它是 TimeUnit 枚举类型,例如 TimeUnit.SECONDSTimeUnit.MILLISECONDS 等。
  5. workQueue:用于存储待执行任务的阻塞队列。常见的队列类型有 ArrayBlockingQueueLinkedBlockingQueueSynchronousQueue 等。
  6. threadFactory:线程工厂,用于创建线程。通过自定义线程工厂,可以为线程设置名称、优先级等属性。
  7. handler:拒绝策略,当工作队列已满且线程池中的线程数量达到 maximumPoolSize 时,新提交的任务会被拒绝,此时会调用该策略来处理被拒绝的任务。常见的拒绝策略有 AbortPolicyCallerRunsPolicyDiscardPolicyDiscardOldestPolicy 等。

CompletableFuture

CompletableFuture 是 Java 8 引入的一个类,位于 java.util.concurrent 包中。它是用于异步编程的工具类,表示一个异步任务的未来结果。CompletableFuture 提供了丰富的 API,用于处理异步任务的完成、组合和异常处理。

CompletableFuture 与 Thread 和 Runnable 的区别

Thread 和 Runnable

   Thread:是 Java 中最基本的线程类,用于创建和管理线程。它提供了线程的基本功能,但不支持异步编程和结果处理。

   Runnable:是一个接口,表示一个可以被线程执行的任务。它通常与 Thread 一起使用,但同样不支持异步编程和结果处理。

        缺点:Thread和Runnable都是在run()中写多线程代码,二者都没有返回值(可以使用轮询和回调)。

        CompletableFuture的出现解决了这个问题,它支持下面功能:
  • 支持异步编程,可以创建异步任务并处理其结果。

  • 链式调用:支持链式调用,可以将多个异步任务组合在一起,形成一个完整的流程。

  • 异常处理:提供了丰富的异常处理机制,可以捕获和处理异步任务中的异常。

  • 组合操作:可以组合多个异步任务,例如 allOf()anyOf(),并等待它们完成。

实例:

 Supplier<String> mm1 = new Supplier<String>() {@Overridepublic String get() {for(int i=0;i<10;i++){System.out.println("1111111111");}return "第一个";}};CompletableFuture<String> dd1 = CompletableFuture.supplyAsync(mm1);Supplier<String> mm2 = new Supplier<String>() {@Overridepublic String get() {for(int i=0;i<10;i++){System.out.println("2222222222222");}return "第二个";}};CompletableFuture<String> dd2 = CompletableFuture.supplyAsync(mm2);Supplier<String> mm3 =()->{         //Lambda表达式(匿名函数)for(int i=0;i<100;i++){System.out.println("3333333333");}return "第三个";};
//        Supplier<String> mm3 = new Supplier<String>() {
//            @Override
//            public String get() {
//                for(int i=0;i<100;i++){
//                    System.out.println("3333333333");
//                }
//                return "第三个";
//            }
//        };CompletableFuture<String> dd3 = CompletableFuture.supplyAsync(mm3);CompletableFuture<Void> vo = CompletableFuture.allOf(dd1, dd2, dd3);Runnable r = new Runnable() {@Overridepublic void run() {System.out.println(dd1.join()+"--------"+dd2.join()+"--------"+dd3.join());}};vo.thenRun(r);vo.join();

  CompletableFuture的重要API:

  • CompletableFuture.runAsync(Runnable runnable)
    • 此方法用于异步执行一个 Runnable 任务,没有返回值。它会使用 ForkJoinPool.commonPool() 作为线程池来执行任务。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class RunAsyncExample {public static void main(String[] args) {CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {System.out.println("Running task asynchronously");});future.join();}
}

  • CompletableFuture.runAsync(Runnable runnable, Executor executor)
    • 与上面的方法类似,但可以指定一个自定义的 Executor 来执行任务(没有返回值)。
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class RunAsyncWithExecutorExample {public static void main(String[] args) {ExecutorService executor = Executors.newSingleThreadExecutor();CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {System.out.println("Running task asynchronously with custom executor");}, executor);future.join();executor.shutdown();}
}

  • CompletableFuture.supplyAsync(Supplier<U> supplier)
    • 异步执行一个 Supplier 任务,有返回值。同样使用 ForkJoinPool.commonPool() 作为线程池。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class SupplyAsyncExample {public static void main(String[] args) {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {return "Result from asynchronous task";});String result = future.join();System.out.println(result);}
}

  • CompletableFuture.supplyAsync(Supplier<U> supplier, Executor executor)
    • 与 supplyAsync(Supplier<U> supplier) 类似,可指定自定义的 Executor 来执行任务。

2. 处理任务结果

  • thenApply(Function<? super T,? extends U> fn)
    • 当 CompletableFuture 完成后,对结果进行转换。返回一个新的 CompletableFuture,其结果是原 CompletableFuture 结果经过 Function 处理后的结果。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class ThenApplyExample {public static void main(String[] args) {CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 5);CompletableFuture<Integer> newFuture = future.thenApply(num -> num * 2);Integer result = newFuture.join();System.out.println(result);}
}

  • thenAccept(Consumer<? super T> action)
    • 当 CompletableFuture 完成后,对结果进行消费,没有返回值。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class ThenAcceptExample {public static void main(String[] args) {CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10);future.thenAccept(num -> System.out.println("Received result: " + num));}
}

  • thenRun(Runnable action)
    • 当 CompletableFuture 完成后,执行一个 Runnable 任务,不关心原 CompletableFuture 的结果。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class ThenRunExample {public static void main(String[] args) {CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 20);future.thenRun(() -> System.out.println("Task completed"));}
}

3. 组合多个 CompletableFuture

  • thenCompose(Function<? super T, ? extends CompletionStage<U>> fn)
    • 用于组合两个 CompletableFuture,前一个 CompletableFuture 的结果作为后一个 CompletableFuture 的输入。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class ThenComposeExample {public static void main(String[] args) {CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 3);CompletableFuture<Integer> future2 = future1.thenCompose(num -> CompletableFuture.supplyAsync(() -> num * 4));Integer result = future2.join();System.out.println(result);}
}

  • thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn)
    • 当两个 CompletableFuture 都完成后,将它们的结果组合起来。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class ThenCombineExample {public static void main(String[] args) {CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 2);CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 3);CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (num1, num2) -> num1 + num2);Integer result = combinedFuture.join();System.out.println(result);}
}

4. 异常处理

  • exceptionally(Function<Throwable, ? extends T> fn)
    • 当 CompletableFuture 出现异常时,使用 Function 处理异常并返回一个默认值。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class ExceptionallyExample {public static void main(String[] args) {CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {if (Math.random() < 0.5) {throw new RuntimeException("Something went wrong");}return 10;});CompletableFuture<Integer> resultFuture = future.exceptionally(ex -> {System.out.println("Caught exception: " + ex.getMessage());return 0;});Integer result = resultFuture.join();System.out.println("Final result: " + result);}
}

  • handle(BiFunction<? super T, Throwable, ? extends U> fn)
    • 无论 CompletableFuture 是否完成或出现异常,都会执行 BiFunction,可以根据是否有异常来处理结果。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class HandleExample {public static void main(String[] args) {CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {if (Math.random() < 0.5) {throw new RuntimeException("Something went wrong");}return 20;});CompletableFuture<Integer> resultFuture = future.handle((result, ex) -> {if (ex != null) {System.out.println("Caught exception: " + ex.getMessage());return 0;}return result;});Integer result = resultFuture.join();System.out.println("Final result: " + result);}
}

5. 等待多个 CompletableFuture 完成

  • CompletableFuture.allOf(CompletableFuture<?>... cfs)
    • 等待所有给定的 CompletableFuture 都完成。返回一个新的 CompletableFuture,当所有输入的 CompletableFuture 都完成时,这个新的 CompletableFuture 也完成。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class AllOfExample {public static void main(String[] args) {CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 1);CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 2);CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> 3);CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);allFutures.join();Integer result1 = future1.join();Integer result2 = future2.join();Integer result3 = future3.join();System.out.println("Results: " + result1 + ", " + result2 + ", " + result3);}
}

  • CompletableFuture.anyOf(CompletableFuture<?>... cfs)
    • 只要有一个给定的 CompletableFuture 完成,就返回一个新的 CompletableFuture,其结果是第一个完成的 CompletableFuture 的结果。
    • 示例代码:
import java.util.concurrent.CompletableFuture;public class AnyOfExample {public static void main(String[] args) {CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return 1;});CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 2);CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(future1, future2);Object result = anyFuture.join();System.out.println("First completed result: " + result);}
}

相关文章:

Java进阶版线程池(超详细 )

线程池 线程池工具类 Executors Executors 是 Java 提供的一个工具类&#xff0c;它包含了多个静态方法&#xff0c;能够方便地创建不同类型的线程池。 newFixedThreadPool 创建一个固定大小的线程池&#xff0c;线程池中的线程数量固定&#xff0c;当有新任务提…...

场外期权只适合上涨行情吗?

场外期权与直接进行期货市场操作相比&#xff0c;场外期权让我们有了更多的选择空间。”目前期权市场有了更多合适的风险管理模式&#xff0c;场外期权衍生品工具与其需求不谋而合&#xff0c;适合做以小博大&#xff0c;做各种对冲大盘下跌风险等等策略&#xff0c;下文为大家…...

echarts图表相关

echarts图表相关 echarts官网折线图实际开发场景一&#xff1a; echarts官网 echarts官网 折线图 实际开发场景一&#xff1a; 只有一条折线&#xff0c;一半实线&#xff0c;一半虚线。 option {tooltip: {trigger: "axis",formatter: (params: any) > {const …...

【操作系统(Linux)】——多线程对共享变量访问的同步与互斥

一、多线程对共享变量的非互斥访问 我们将要做的&#xff1a;构造多线程共享变量竞争的案例&#xff0c;并分析现象发生的原因&#xff0c;进而思考解决方式。 案例源代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #inc…...

deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_16

目录 1、下载链接1.1、CSDN链接&#xff0c;含权重文件直接使用&#xff0c;建议直接下这个&#xff0c;还不限速。1.2 Github链接&#xff1a; 2、下载代码&#xff0c;下载预训练好的权重3、预测代码4、像素提取&#xff0c;或者说类别提取5、文档部分内容截图6、其他数据处理…...

[前端]从人体结构看网页三要素:HTML、CSS 与 JavaScript

目录 一、HTML:网页的 “骨架” 二、CSS:网页的 “血肉” 三、JavaScript:网页的 “神经系统” 四、三者协同构建精彩网页 在互联网的浩瀚海洋中,网页是我们与世界交互的重要窗口。一个精彩的网页背后,离不开 HTML、CSS 和 JavaScript 这三位 “幕后英雄”。有趣的是,…...

【Leetcode】3375. 使数组的值全部为 K 的最少操作次数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个整数数组 nums 和一个整数 k 。 如果一个数组中所有 严格大于 h 的整数值都 相等 &#xff0c;那么我们称整数 h 是 合法的 。 比方说&#xff0c;如果 nums [10, 8, 10…...

封装uniapp request promise化

uniapp request 封装 一、 封装方法1. 使用 promis 封装 request2. 封装 api 在 api.js3.在要请求的页面 调用 api 一、 封装方法 1. 使用 promis 封装 request const BASE_URL 你的url接口 //比如 http://198.12.3.3/pzexport function request(config {}){let {url,dat…...

架构演进成熟度校验体系构建

架构演进成熟度校验体系构建 ——基于电商价格服务Checklist的图形化实践指南 一、成熟度校验全景视图 #mermaid-svg-tXchQ6nY7QzNUrL1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-tXchQ6nY7QzNUrL1 .error-ico…...

Llama 4全面评测:官方数据亮眼,社区测试显不足之处

引言 2025年4月&#xff0c;Meta正式发布了全新的Llama 4系列模型&#xff0c;这标志着Llama生态系统进入了一个全新的时代。Llama 4不仅是Meta首个原生多模态模型&#xff0c;还采用了混合专家(MoE)架构&#xff0c;并提供了前所未有的上下文长度支持。本文将详细介绍Llama 4…...

kotlin 多个fragment beginTransaction容器添加使用

在Kotlin中如何使用Fragment的beginTransaction来添加多个Fragment到容器中。我需要先回顾一下Fragment的基本用法&#xff0c;然后考虑多个Fragment的情况。 FragmentTransaction的beginTransaction是用来开启一个事务&#xff0c;然后添加、替换或移除Fragment。通常&#x…...

(PTA) L2-011-L2-015

L2-012 关于堆的判断 由于没有得到AC代码&#xff08;1&#xff0c;3测试点错误&#xff09;,这里先不做展示&#xff0c;等后续复盘的时候进行补充。 L2-011 玩转二叉树 给定一棵二叉树的中序遍历和前序遍历&#xff0c;请你先将树做个镜面反转&#xff0c;再输出反转后的层序…...

管理Linux服务器的用户和组

用户/组 命令符会展示当前用户名和主机名 创建用户&#xff0c;同时创建同名组 useradd 用户名 设置密码 passwd 用户名 切换用户登录 su 用户名 删除用户 userdel -r 用户名 记录用户信息的文件 /etc/passwd 记录密码&#xff08;密文&#xff09;信息的文件 /etc/sh…...

奇安信驻场面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...

Testbench设计

一、几个名词&#xff1a; 被仿真的文件叫DUT&#xff08;Design under Test&#xff09; 编写Testbench的目的 验证设计有没问题。 怎么写Testbench&#xff1f; 四、Teshbench各个部分的写法&#xff1a; 外部信号就是外面连接的信号。...

使用IPython有哪些好处?

这里总结了50个使用IPython的好处&#xff0c;大大提升开发效率&#xff01; 什么是IPython&#xff1f;可能很多人已经在用&#xff0c;却不知道它到底是什么。 根据维基百科的解释&#xff1a; IPython是一种基于Python的交互式解释器&#xff0c;提供了强大的编辑和交互功能…...

加油站小程序实战教程10开通会员

目录 1 修改用户登录逻辑2 创建变量3 调用API总结 我们上一篇搭建了开通会员的界面&#xff0c;有了界面的时候就需要加入一些逻辑来控制界面显示。我们的逻辑是当用户打开我的页面的时候&#xff0c;在页面加载完毕后调用API看用户是否已经开通会员了&#xff0c;如果未开通就…...

NO.84十六届蓝桥杯备战|动态规划-路径类DP|矩阵的最小路径和|迷雾森林|过河卒|方格取数(C++)

路径类dp是线性dp的⼀种&#xff0c;它是在⼀个nm的矩阵中设置⼀个⾏⾛规则&#xff0c;研究从起点⾛到终点的⽅案数、最⼩路径和或者最⼤路径和等等的问题 矩阵的最小路径和_牛客题霸_牛客网 状态表⽰&#xff1a; dp[i][j]表⽰&#xff1a;到达[i, j]位置处&#xff0c;最⼩…...

WHAT - React 技术栈常用库/工具

目录 基础类状态管理路由管理UI 组件库开发工具 / 辅助库测试相关表单和数据展示其它实用类代码重构应用迁移&#xff1a;PWA代码组织与架构建议&#xff08;选项&#xff09; 下面是一个 React 技术栈常用库/工具清单&#xff0c;按不同分类整理&#xff0c;涵盖开发、状态管理…...

FreeSWITCH的SIP配置

确认 FreeSWITCH 的 SIP 配置 FreeSWITCH 的 SIP 配置文件通常位于 /usr/local/freeswitch/conf/sip_profiles 目录下。默认情况下&#xff0c;FreeSWITCH 使用 internal.xml 和 external.xml 作为 SIP 配置文件。 查看 internal.xml 配置 编辑 /usr/local/freeswitch/conf/sip…...

Spark核心知识总结

一、Spark运行架构 &#xff08;一&#xff09;整体结构 Spark框架采用标准master - slave结构&#xff0c;Driver为master管理作业任务调度&#xff0c;Executor为slave负责实际执行任务。 &#xff08;二&#xff09;核心组件 1. Driver&#xff1a;执行Spark任务的main方法&…...

第1节:计算机视觉发展简史

计算机视觉与图像分类概述&#xff1a;计算机视觉发展简史 计算机视觉&#xff08;Computer Vision&#xff09;作为人工智能领域的重要分支&#xff0c;是一门研究如何使机器"看"的科学&#xff0c;更具体地说&#xff0c;是指用摄影机和计算机代替人眼对目标进行识…...

2D 与 3D 连线效果全解析 | 从平面到立体

HT 是一个灵活多变的前端组件库&#xff0c;具备丰富的功能和效果&#xff0c;满足多种开发需求。让我们将其效果化整为零&#xff0c;逐一拆解具体案例&#xff0c;帮助你更好地理解其实现方案。 在此篇文章中&#xff0c;让我们一起深入探讨 2D 与 3D 的连线效果是如何实现的…...

Django Cookies 实际项目示例

Django Cookies 实际项目示例 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 Django Cookies 实际项目示例介绍什么是 Django Cookies?为什么要关心 Django Cookies?Django Cookie…...

【问题排查】SQLite安装失败

启动 Django 自带的开发服务器 python manage.py runserver出现如下报错&#xff1a; [rootiZ2zedudtf2cwzi9argky2Z myproject]# python manage.py runserver Watching for file changes with StatReloader Performing system checks...System check identified no issues (…...

stream流Collectors.toMap(),key值重复问题

文章目录 一、问题二、问题示例三、原因四、解决方法4.1、方案一 一、问题 发现Collectors.toMap的一个坑&#xff0c;若key值重复的时候会抛异常。如&#xff1a; IllegalStateException: Duplicate key 男 二、问题示例 报错示例如下&#xff1a; import lombok.AllArgsC…...

STM32(基于标准库)

参考博客&#xff1a;江科大STM32笔记 Stm32外设 一、GPIO 基础 GPIO位结构 I/O引脚的保护二极管是对输入电压进行限幅的上面的二极管接VDD, 3.3V,下面接VSS, 0V&#xff0c;当输入电压 >3.3V 那上方这个二极管就会导通&#xff0c;输入电压产生的电流就会大部分充入VD…...

OpenStack Yoga版安装笔记(十八)Self-service networks配置笔记

1、官方文档 在OpenStack官方安装文档中&#xff0c;提供了两个网络配置选项&#xff1a; Option1&#xff1a;Provider networksOption2&#xff1a;Self-service networks 这两个选项并不冲突&#xff0c;可以在OpenStack环境中同时配置。 在《OpenStack Yoga版安装笔记&…...

2025年黑龙江建筑安全员 C3 证考试题库练习题

黑龙江建筑安全员 C3 证考试题库练习题 1、消防控制室是设有火灾自动报警设备和消防设施控制设备&#xff0c;用于接收、显示、处理&#xff08; &#xff09;&#xff0c;控制相关消防设施的专门处所2。 A. 安全信息 B. 设备信息 C. 通讯信号 D. 火灾报警信号 答案&…...

JavaScript数据结构-Map的使用

在 JavaScript 中&#xff0c;Map 是 ES6 引入的一种新的数据结构&#xff0c;它类似于对象&#xff0c;也是键值对的集合&#xff0c;但 Map 的键可以是任意类型的值&#xff08;对象、函数、基本类型等&#xff09;&#xff0c;而传统对象的键只能是字符串或 Symbol&#xff…...

LeetCode面试经典150题

目录 力扣80. 删除有序数组中的重复项 II 代码解析 力扣274. H 指数 代码解析 力扣151. 反转字符串中的单词 解析代码 力扣12. 整数转罗马数字 解析代码 力扣28. 找出字符串中第一个匹配项的下标 解析代码1&#xff08;暴力模拟&#xff09; 解析代码2&#xff08;K…...

mysql之等值连接8个实例

以下实例以常见的业务场景为例&#xff0c;使用 MySQL 语法&#xff0c;假设存在员工表&#xff08;employees&#xff09;、部门表&#xff08;departments&#xff09;、订单表&#xff08;orders&#xff09;、客户表&#xff08;customers&#xff09;等&#xff0c;来展示…...

C基础笔记_指针专题

一:C 和 C 偏爱使用指针的原因 1. 通过指针可以直接操作内存 C 和 C 是系统级编程语言&#xff0c;它们的设计目标之一是允许开发者直接与硬件交互并高效地管理资源。 指针的本质&#xff1a;指针本质上是一个存储内存地址的变量&#xff0c;它让程序员可以直接访问和操作内…...

GPT-SoVITS Windows 配置与推理笔记(自用)

GPT-SoVITS Windows 配置与推理笔记&#xff08;自用&#xff09; 这是给自己留的备份&#xff0c;方便下次查。Windows 端配置和推理为主&#xff0c;代码为核心&#xff0c;直接干货。 环境准备 系统&#xff1a;Windows 10/11Python&#xff1a;3.9&#xff08;别用别的版…...

【设计模式】面向对象开发学习OOPC

PLOOC-裸机思维 PLOOC OOPC精要——撩开“对象”的神秘面纱 C/C面向对象编程之封装-KK 面向过程&#xff0c;本质是“顺序&#xff0c;循环&#xff0c;分支”面向对象&#xff0c;本质是“继承&#xff0c;封装&#xff0c;多态”参考的书籍&#xff1a;《UMLOOPC嵌入式C语言…...

LVGL开发指南

一、主流ARM开发UI界面库 主流ARM开发UI界面库的详细对比分析,从多个维度评估各库的适用场景: 1. 基础对比表 特性LVGLQt for MCUEmbedded WizardTouchGFXemWin许可证MIT开源商业商业商业(STM32免费)商业RAM最小需求16KB512KB64KB256KB50KBFlash占用64KB+1MB+200KB+500KB+1…...

linux shell looop循环写法

在 Linux Shell 中编写loop循环的常见方法有以下几种&#xff0c;适用于持续执行任务或监控场景&#xff1a; 1. while true 循环&#xff08;最常用&#xff09; while true; do# 循环体内的命令echo "Running..."sleep 1 # 避免 CPU 占用过高 done 终止方式&…...

【力扣hot100题】(075)数据流的中位数

一开始只建立了一个优先队列&#xff0c;每次查询中位数时都要遍历一遍于是喜提时间超限&#xff0c;看了答案才恍然大悟原来还有这么聪明的办法。 方法是建立两个优先队列&#xff0c;一个大根堆一个小根堆&#xff0c;大根堆记录较小的数&#xff0c;小根堆记录较大的数。 …...

蓝桥杯刷题总结 + 应赛技巧

当各位小伙伴们看到这篇文章的时候想必蓝桥杯也快开赛了&#xff0c;那么本篇文章博主就来总结一下一些蓝桥杯的应赛技巧&#xff0c;那么依旧先来走个流程 那么接下来我们分成几个板块进行总结 首先是一些基本语法 编程语言的基本语法 首先是数组&#xff0c;在存数据的时候…...

JetBrains Terminal 又发布新架构,Android Studio 将再次迎来新终端

不到一年的时间&#xff0c;JetBrains 又要对 Terminal 「大刀阔斧」&#xff0c;本次发布的新终端是重构后的全新的架构&#xff0c;而上一次终端大调整还是去年 8 月的 v2024.2 版本&#xff0c;并且在「Android Studio Ladybug | 2024.2.1」也被引入。 不知道你们用不用内置…...

怎么构造思维链数据?思维链提示工程的五大原则

我来为您翻译这篇关于思维链提示工程的文章&#xff0c;采用通俗易懂的中文表达&#xff1a; 思维链(CoT)提示工程是生成式AI(GenAI)中一种强大的方法&#xff0c;它能让模型通过逐步推理来解决复杂任务。通过构建引导模型思考过程的提示&#xff0c;思维链能提高输出的准确性…...

mongodb--用户管理

文章目录 MongoDB 用户管理1. 连接到 MongoDB2. 用户创建2.1 创建管理员用户2.2 创建特定数据库用户2.3 常用内置角色 3. 用户管理操作3.1 查看所有用户3.2 查看特定用户信息3.3 更新用户密码3.4 添加用户角色3.5 移除用户角色3.6 删除用户 4. 权限修改4.1 创建自定义角色4.2 将…...

2025年考OCP认证有用吗?

在数字化转型的浪潮中&#xff0c;数据库管理技术成为企业核心竞争力的基石。Oracle作为全球领先的数据库解决方案提供商&#xff0c;其OCP&#xff08;Oracle Certified Professional&#xff09;认证不仅是技术能力的权威背书&#xff0c;更是职业发展的强力引擎。以下从多个…...

川翔云电脑:D5 渲染摆脱硬件限制,云端高效创作

在设计领域&#xff0c;D5 渲染器凭借实时光追技术、高效工作流程及优质输出效果&#xff0c;成为设计师的得力工具。然而&#xff0c;其对高端 RTX 显卡的依赖&#xff0c;导致硬件成本高、本地性能受限及办公地点固定等问题&#xff0c;让不少创作者望而却步。 D5 渲染器的优…...

设计模式(23种设计模式简介)

设计模式 简介 设计模式是解决软件设计中常见问题的可重用解决方案模板&#xff0c;通过总结反复验证的代码设计经验&#xff0c;提升代码的可重用性、可维护性和扩展性。其核心是通过标准化的设计思想&#xff0c;让代码更易理解、协作更高效&#xff0c;并在面向对象编程中…...

Python设计模式:工厂模式

1. 什么是工厂模式&#xff1f; 工厂模式是一种创建对象的设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但不暴露对象创建的具体逻辑。工厂模式的核心思想是将对象的创建与使用分离&#xff0c;从而提高代码的灵活性和可维护性。 1.1 工厂模式的类型 1.1.1 简…...

UE5 给函数分类

如果函数太多不方便找&#xff0c;我们可以给函数设置一个分组 选中一个函数&#xff0c;修改它的类别 然后在函数列表里可以看到分好的类 其他函数可以直接拖进类别里&#xff0c;不用每个函数都手动设置类别 一次只能拖动一个函数...

5️⃣ Coze+AI应用基础教学(2025年全新版本)

目录 一、了解应用开发 1.1 扣子应用能做什么 1.2 开发流程 1.3 开发环境 二、快速搭建一个AI应用 2.1 AI翻译应用介绍 2.2 设计你的应用功能 2.3 创建 AI 应用项目 2.4 编写业务逻辑&#xff08;新建工作流&#xff09; 2.5 搭建用户界面 2.6 效果测试 2.7 发布应…...

高级前端题库

前端题库 JS篇 如何理解作用域和作用域链 作用域 作用域就是变量或函数在其内能够被访问的“可见区域” 全局作用域局部作用域 作用域链 当在某个作用域中尝试访问一个变量时&#xff0c;JS引擎会从当前作用域开始&#xff0c;沿着作用域链向上逐级开始查找&#xff0c;直到…...

博途 TIA Portal之1200做主站与汇川EASY的TCP通讯

前言,虽然已经做了几篇关于TCP通讯的文章,但是不同的PLC之间的配合可能不同,下面将演示这种差异。 关于汇川EASY做从站的配置请参见下方链接文章:汇川EASY系列之以太网通讯(套接字socket做从站)_汇川以太网tcp套接字fb块-CSDN博客 1、硬件准备: 1200PLC,汇川EASY320…...