jdk线程池技术
jdk线程池ThreadPoolExecutor的7个参数
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0)throw new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw new NullPointerException();this.acc = System.getSecurityManager() == null ?null :AccessController.getContext();this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;}
corePoolSize
核心线程个数 ,int类型
maximunPoolSize
最大线程数 ,int类型
keepAliveTime存活时间
传long类型的值,
当线程池中的线程数大于corePoolSize核心线程个数,且线程是闲置状态,则这些空闲线程的最大存活时间是KeepAliveTime
TimeUnit
存活时间的单位, 有时/分/秒/毫秒等可选配置
workQueue
存放待执行任务的阻塞队列, 可传入
arrayBlockingQueue 基于数组的有界阻塞队列;
linkedBlockingQueue基于链表的无界阻塞队列;
synchronousQueue最多只有1个元素的同步队列, 队列容量是1;
priorityBlockingQueue带优先级的无界阻塞队列,出队元素是优先级最高或最低的元素;
DelayQueue 带延迟功能的无界阻塞队列, 过期元素才会出队,队头元素是快要过期的元素.
以上几个Queue都是BlockingQueue的实现类
threadFactory
创建线程的工厂,
jdk提供了DefaultThreadFactory默认工厂,
用Executors.defaultThreadFactory()就行.
RejectedExecutionHandler拒绝策略
当队列满且线程数达到maximunPoolSize最大线程数后采取的策略, 可传入
AbortPolicy 抛出异常,这个是默认策略.
CallersRunPolicy 由调用者所在的线程执行任务
DiscardOldestPolicy 丢弃最老的任务
DiscardPolicy 丢弃新任务,不抛出异常
jdk提供的Executors快速创建线程池的用法
jdk封装了一个Executors类可以直接创建各种线程池,
用法形如
ExecutorService pool = Executors.newXXXXXPool()
可以用Executors类创建业务常用的3种线程池
固定线程池
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}
创建一个核心线程数和最大线程数相同的线程池,都为nThreads,
且线程池的阻塞队列长度是Integer.MAX_VALUE,
且keepAliveTime=0,说明只要线程个数比核心线程个数多并且当前空闲则回收.
单线程线程池
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}
创建一个核心线程数和最大线程数都是1的线程池,
且线程池的阻塞队列长度是Integer.MAX_VALUE,
且keepAliveTime=0,说明只要线程个数比核心线程个数多并且当前空闲则回收.
已缓存的线程池
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}
创建一个按需创建线程的线程池,初始线程个数为0,最多线程个数为
Integer.MAX_VALUE,并且阻塞队列为同步队列.
keepAliveTime=60,说明当前线程在60s内空闲则回收.
CachedThreadPool的特殊之处在于,加入同步队列的任务会被马上执行,同步队列里边最多只有1个任务.
使用创建好的ExecutorService 线程池执行异步任务
submit操作
提交一个任务, 任务参数可以是 Runnable实现类 或 Callable 实现类.
返回的类型是Future 表示异步计算的结果, 可以用future.get()方法拿到数据.
shutdown操作
调用shutdown方法后,线程池就不会再接受新的任务了,但是工作队列里边的任务还是要执行的, 该方法会立刻返回,不等待队列任务完成再返回.
使用线程池的情况下当程序结束时记得调用shutdown关闭线程池, 如果不关闭线程池,则会导致 线程池资源一直不被释放.
shutdownNow操作
调用shutdownNow方法后,线程池就不会再接受新的任务了,并且会丢弃工作队列里边的任务,正在执行的任务会被中断,该方法会立刻返回,并不等待激活的任务执行完成. 返回值为这时候队列里面被丢弃的任务列表.
awaitTermination操作
当线程调用awaitTermination方法后,当前线程会被阻塞, 直到线程池状态变为TERMINATED 才返回,或者等待时间超时才返回.
案例1-测试FixedThreadPool执行CallableTask任务
package cn.demo;import cn.hutool.core.util.RandomUtil;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class ExecutorTestsForCallableTask {public static void main(String[] args) throws ExecutionException, InterruptedException {String res1 = "";String res2 = "";String res3 = "";String res4 = "";ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);//submit 提交4个任务, 实际执行时,任务是并发执行的,执行顺序不固定Future<String> submit1 = fixedThreadPool.submit(new TestCallableTask(RandomUtil.randomInt(30,1000),"t1"));Future<String> submit2 = fixedThreadPool.submit(new TestCallableTask(RandomUtil.randomInt(100,400),"t2"));Future<String> submit3 = fixedThreadPool.submit(new TestCallableTask(RandomUtil.randomInt(30,350),"t3"));Future<String> submit4 = fixedThreadPool.submit(new TestCallableTask(RandomUtil.randomInt(310,500),"t4"));res1 = submit1.get();System.out.println(res1);res2 = submit2.get();System.out.println(res2);res3 = submit3.get();System.out.println(res3);res4 = submit4.get();System.out.println(res4);fixedThreadPool.shutdown();}
}
package cn.demo;import cn.hutool.core.util.RandomUtil;import java.time.LocalDateTime;
import java.util.concurrent.Callable;public class TestCallableTask implements Callable<String> {private int testIntVal;private String taskSeq;public TestCallableTask(int testIntVal, String taskSeq) {this.testIntVal = testIntVal;this.taskSeq = taskSeq;}@Overridepublic String call() throws Exception {String s = LocalDateTime.now().toString();System.out.println(s+"->"+taskSeq+" run ....");int i = testIntVal;System.out.println(i);try {Thread.sleep(RandomUtil.randomInt(100,300));} catch (InterruptedException e) {e.printStackTrace();}if (i>300){return "300more";}else {return "300less";}}
}
案例2-测试FixedThreadPool执行RunnableTask任务
package cn.demo;import java.util.concurrent.*;public class ExecutorTestsForRunnableTask {public static void main(String[] args) throws ExecutionException, InterruptedException {String res1 = "";String res2 = "";String res3 = "";String res4 = "";ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);//submit 提交4个任务, 实际执行时,任务是并发执行的,执行顺序不固定Task1Param task1Param = new Task1Param();task1Param.setUrl("f23r3r");task1Param.setName("1heg43t34t34t");Future<String> stringFuture = fixedThreadPool.submit(new TestTask1Runnable(task1Param), "success1 ok");Task1Param t2 = new Task1Param();t2.setUrl("gnsg2323");t2.setName("2wwswer2r1asdaaws");Future<String> f2 = fixedThreadPool.submit(new TestTask1Runnable(t2), "success2 ok");Task1Param t3 = new Task1Param();t3.setUrl("thwasr23r");t3.setName("3erzawfe23rawsf");Future<String> f3 = fixedThreadPool.submit(new TestTask1Runnable(t3), "success3 ok");Task1Param t4 = new Task1Param();t4.setUrl("mjkdsragt");t4.setName("4tbertydraewrsfk");Future<String> f4 = fixedThreadPool.submit(new TestTask1Runnable(t4), "success4 ok");res1 = stringFuture.get();System.out.println(res1);res2 = f2.get();System.out.println(res2);res3 = f3.get();System.out.println(res3);res4 = f4.get();System.out.println(res4);fixedThreadPool.shutdown();}
}
package cn.demo;import cn.hutool.core.util.RandomUtil;
import java.time.LocalDateTime;public class TestTask1Runnable implements Runnable{private Task1Param task1Param;public TestTask1Runnable(Task1Param task1Param) {this.task1Param = task1Param;}@Overridepublic void run() {try {Thread.sleep(RandomUtil.randomInt(200,600));} catch (InterruptedException e) {e.printStackTrace();}System.out.println(task1Param.getName());System.out.println(task1Param.getUrl());String s = LocalDateTime.now().toString();System.out.println(s+" TestTask1Runnable run ....");}
}
使用自定义的ThreadPoolExecutor来执行异步任务
package cn.demo;import cn.hutool.core.util.RandomUtil;
import java.util.concurrent.*;public class TpeTest {private final static ThreadPoolExecutor pool =new ThreadPoolExecutor(1,1,1L, TimeUnit.MINUTES,new ArrayBlockingQueue<Runnable>(1),new ThreadPoolExecutor.CallerRunsPolicy());public static void main(String[] args) throws ExecutionException, InterruptedException {Future<String> submit1 = pool.submit(new TestCallableTask(RandomUtil.randomInt(30,1000),"t1"));Future<String> submit2 = pool.submit(new TestCallableTask(RandomUtil.randomInt(100,400),"t2"));Future<String> submit3 = pool.submit(new TestCallableTask(RandomUtil.randomInt(30,350),"t3"));Future<String> submit4 = pool.submit(new TestCallableTask(RandomUtil.randomInt(310,500),"t4"));System.out.println("task1-"+submit1.get());System.out.println("task2-"+submit2.get());System.out.println("task3-"+submit3.get());System.out.println("task4-"+submit4.get());pool.shutdown();}
}
线程池使用FutureTask时需要注意的事情
线程池使用FutureTask时,如果把拒绝策略设置为 DiscardPolicy 和 DiscardOldestPolicy,并且在被拒绝的任务的Future对象上调用了无参get方法,那么调用线程会一直被阻塞.
如上面的代码,如果把CallerRunsPolicy替换成 DiscardPolicy 或 DiscardOldestPolicy ,就会导致任务一直被阻塞,一直无法取到future.get()的值.
相关文章:
CyberRT_不同的启动方式的源码解读
Cyberrt源码解读componentnodereader/writer service/client parameterscheduletransportapollo/cyber/cyber.ccCreateNode(){return std::unique_ptr<Node>(new Node(node_name,name_space))}apollo/cyber/init.ccInit()OnShutdown()apollo/cyber/state.hWaitForShutd…...
SQL Server 2012提供了多种备份和还原数据库的方法,包括以下几种:
SQL Server 2012提供了多种备份和还原数据库的方法,包括以下几种:SQL Server Management Studio(SSMS):SSMS是一个支持图形用户界面的工具,可以通过它备份和还原整个数据库或特定的数据表、视图等。在SSMS中,可以通过右键单击数据库并选择“任务” > “备份”或“还原…...
读人工智能时代与人类未来笔记07_人工智能往何处去
读人工智能时代与人类未来笔记07_人工智能往何处去1. 人工智能的限制和管理 1.1. 在前几代人工智能中,人们将社会对现实的某种理解提炼为程序代码,而当下的机器学习人工智能与之不同,它们在很大程度上是靠自己对现实进行建模 1.2. 虽然开发人员可以检…...
给github新增讨论功能
给github新增讨论功能给github新增讨论功能 giscus讨论功能说明 https://giscus.app/zh-CN giscus GitHub https://github.com/giscus/giscus/blob/main/README.zh-CN.md网站:http://shibowl.topgithub:https://github.com/hanbinjxnc博客园:https://www.cnblogs.com/hool 博…...
鸿蒙HarmonyOS实战-Stage模型(开发卡片页面)
🚀一、开发卡片页面 HarmonyOS元服务卡片页面(Metaservice Card Page)是指在HarmonyOS系统中,用于展示元服务的页面界面。元服务是指一组提供特定功能或服务的组件,例如天气服务、音乐播放服务等。元服务卡片页面可以显示元服务的相关信息和操作选项,用户可以通过点击卡…...
11.15
距离NOIP还有两天,可能高二压力比较大吧😥😥😥,感觉自己完全体会不到那种即将接近尾声的故事的感觉😥😥😥,我不知道该如何表达,但是我对学长们肯定不能感同身受,那就祝他们NOIP RP++吧。 跟tkt聊了很久(昨天,他跟我们说高中考完NOIP有些会回亨氏?🥰那样就…...
jdk线程池技术
jdk线程池ThreadPoolExecutor的7个参数 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {if (corePoolSize &l…...
keepalived+nginx 双机热备搭建
keepalivednginx 双机热备搭建一、准备工作1.1 准备两台centos7.91.2 nginx 与 keepalived软件 双机安装1.3 ip分配1.4 修改主机名1.5 关闭selinux(双机执行)1.6 修改hosts(双机执行)二、安装keepalived2.1 执行一下命令安装keepa…...
【云原生】容器编排技术Docker Compose
为什么需要Docker ComposeDocker Compose介绍Docker Compose安装Docker Compose版本介绍Docker Compose基本命令介绍Docker Compose实战Docker Compose Yml文件介绍总结为什么需要Docker Compose Docker帮助我们解决服务的打包安装的问题,随着而来的问题就是服务过…...
String、StringBuilder、StringBuffer的四大区别解析
面试官问:String、StringBuilder、StringBuffer有什么区别么? 这个问题是个高频问题,所以今天从源码上进行深度刨析他们的区别。 如何回答: 从四个点出发: 1、可变/不可变类 String是不可变类。他被被final修饰&…...
【C#进阶】C# 匿名方法
序号系列文章18【C#进阶】C# 事件19【C#进阶】C# 集合类20【C#进阶】C# 泛型文章目录前言1、什么是匿名方法?2、delegate 运算符3、Lambda 表达式3.1、Lambda 表达式的自然类型3.2、Lambda 表达式的显示返回类型4、关于匿名方法的总结结语前言 📺 hello大…...
C++并发编程之二 在线程间共享数据
文章目录1.1 互斥锁(mutex)保护共享数据1.1.1 std::mutex 的成员函数 std::mutex::lock() 和std::mutex::unlock() (不推荐使用)1.1.2 使用std::lock_guard保护共享数据1.1.3 使用std::unique_lock保护共享数据1.2 保护共享数据的其他方式1.2.1 初始化过…...
FL Studio和Cubase哪个容易一些 FL Studio和Cubase修音哪个好
FL Studio和Cubase哪个容易一些?FL Studio是很适合新手使用的宿主软件。FL Studio和Cubase修音哪个好?FL Studio和Cubase在修音方面各有千秋。 一、FL Studio和Cubase哪个容易一些 FL Studio是很适合新手上手的宿主软件,这得益于FL Studio独…...
限定学校|在站博士后省公派新加坡国立大学从事博后研究
Y博士为国内在站博士后,我们向其推荐了人社部博管办国外博士后派出项目及所在省的相关项目,最终助其获得新加坡国立大学的博士后邀请函,鉴于该导师名列全球高被引科学家榜单,顺利获批省国际培养博士后资助项目,如期出国…...
信息技术最全总结(备考教资)
信息技术 备考教资信息技术知识点总结,欢迎收藏!需要xmind和备考书籍的可以评论区留言。 第一部分-学科专业知识 第一章-信息技术基础知识 信息与信息技术概述 信息概述 信息的定义 信息本身不是实体信息是通过文字、数字、图像、图形、声音、视频等方…...
spring5(三):IOC操作Bean管理(基于xml方式)
IOC操作Bean管理(基于xml方式)前言一、基于 xml 方式创建对象二、基于 xml 方式注入属性1. 使用 set 方法进行属性注入2. 使用有参数构造进行属性注入3. p 名称空间注入简化操作(了解)三、xml 注入其它类型属性1. 字面量2. 注入属…...
Vue的快速上手
一、创建一个 Vue 应用 前提条件 熟悉命令行已安装 16.0 或更高版本的 Node.js在本篇中,我们将介绍如何在本地搭建 Vue 单页应用。创建的项目将使用基于 Vite 的构建设置,并允许我们使用 Vue 的单文件组件 (SFC)。 确保你安装了最新版本的 Node.js&…...
通过ELK+kafka采集微服务日志
在springboot微服务中采集日志推送kafka背景整体流程图快速搭建kafkazk开发环境通过logback记录日志到kafka快速搭建ELK环境Kibana查看,统计日志背景 在分布式的项目中,各功能模块产生的日志比较分散,同时为满足性能要求,同一个微…...
开启新航路,拓尔思发力AIGC市场 | 爱分析调研
2022年,随着AI聊天机器人GhatGPT在世界范围内持续火爆,极具创意、表现力、个性化且能快速迭代的AIGC技术成功破圈,成为全民讨论热点。 AIGC是指在确定主题下,由算法模型自动生成内容,包括单模态内容如文本、图像、音频…...
01-死磕QNX someip
1. vsomeip3.1.20版本 环境配置 export COMMONAPI_CONFIG/etc/commonapi.ini export LD_LIBRARY_PATH/sdcard/someip:$LD_LIBRARY_PATH export VSOMEIP_CONFIGURATION/etc/vsomeip-service.json export VSOMEIP_APPLICATION_NAMEHelloWorldSomeIPService sysctl -w net.ine…...
OTFS输入输出关系
目录 1. OTFS输入输出关系的矩阵表示 1.1 OTFS:矩阵表示 1.2 OTFS发射机的实现 1.2.1 传统的OTFS调制 ISFFT 海森堡变换 1.2.2 基于IDZT的OTFS调制 1.3 OTFS接收机的实现 1.3.1 传统的OTFS解调 维格纳变换 SFFT 1.3.2 基于DZT的OTFS解调 Appendix-Matlab C…...
Java的抽象类和接口
目录 一 、抽象类 1、抽象类概念 2、抽象类语法 3、抽象类特性 4、抽象类的作用 二、接口 1、接口的概念 2、语法规则 3、接口使用 4、接口特性 5、实现多个接口 6、接口间的继承 7、抽象类和接口的区别 8、接口使用实例 9、Clonable 接口和深拷贝 三、Object类…...
作为一个女测试员是什么样的体验?
面试时极度紧张,语无伦次,觉得肯定没戏,最后却拿到高薪offer。 工作之后我听同事们讲,测试总监面试官并没打算要我,但身边的人都问他: 那个小姐姐什么时候来报道?... 于是在众人的期待的目光…...
移动端 REM 适配
Vant 中的样式默认使用 px 作为单位,如果需要使用 rem 单位,推荐使用以下两个工具: postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 rem lib-flexible 用于设置 rem 基准值 下面我们分别将这两个工具配置到项目中完成 R…...
哈希表【leetcode】
笔记:代码随想录 理论 概念 哈希表(hash table,散列表):是根据关键码的值而直接访问的数据结构,说白,数组就是一张哈希表。 哈希函数:把变量直接映射为表上的索引。 哈希碰撞&a…...
【Gem5】有关gem5模拟器的资料导航
网上有关gem5模拟器的资料、博客良莠不齐,这里记录一些总结的很好的博客与自己的学习探索。 一、gem5模拟器使用入门 官方的教程: learning_gem5:包括gem5简介、修改扩展gem5的示例、Ruby相关的缓存一致性等。gem5 Documentation࿱…...
R语言中apply系列函数详解
文章目录applylapply, sapply, vapplyrapplytapplymapplyR语言的循环效率并不高,所以并不推荐循环以及循环嵌套。为了实现循环功能的情况下,兼顾效率,R语言提供了apply系列函数,用于对规则的数据进行函数式的迭代处理。 apply a…...
AOP的另类用法 (权限校验自定义注解)
👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 AOP的另类用法 (权限校验&&自定义注解) 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉…...
【机器学习】机器学习建模调参方法总结
文章目录一、前言1.1 数据来源1.2 理论简介二、知识总结2.1 回归分析2.2 长尾分布2.3 欠拟合与过拟合2.4 正则化2.5 调参方法2.5.1 贪心调参 (坐标下降)2.5.2 网格调参GridSearchCV2.5.3 贝叶斯调参三、建模与调参3.1 线性回归3.1.1 模型建立3.1.2 查看训…...
Python数据分析师|Pandas之基础知识
版权声明:原创不易,本文禁止抄袭、转载,侵权必究! 目录一、数据分析简介二、数据分析简介三、数据查看四、知识总结五、作者Info一、数据分析简介 随着科技的发展,数据变得尤为重要,甚至有着“数据为王”&…...
macOS 13.3(22E252)/12.6.4/11.7.5正式版发布
系统介绍 3 月 28 日消息,苹果今日向 Mac 电脑用户推送了 macOS 13.3 更新(内部版本号:22E252)苹果今天还发布了macOS Monterey 12.6.4和macOS Big Sur 11.7.5,本次更新距离上次发布隔了 42 天。 macOS Ventura 带来…...
速度与兼容性功能大比拼:7款浏览器测评,哪一款更好用
还在为使用哪款浏览器而发愁吗?电脑配置低,又想浏览网页顺畅、下载速度快,那么就要挑选功能齐全、速度快的浏览器。话不多说,给大家做了7款浏览器的最全测评,看看2023年哪个浏览器更好用,更适合自己。 本次…...
【建议收藏】2023年中高级软件测试大厂面试秘籍,为你保驾护航金三银四,直通大厂
前言 从几十份顶级面试仓库和300多篇高质量面经中总结出一份全面成体系化的软件测试高级面试题集。 随着软件测试岗位技术发展的成熟,自动化、性能、框架等一下子就进入了我们的视野内,同时,软件测试自身的技术栈也正在不断扩展,…...
Cinema 4D 2023.1.3安装包下载及安装教程
[软件名称]:Cinema 4D 2023.1.3 [软件大小]: 1.0GB [安装环境]: Win11/Win 10 [软件安装包下载]: https://pan.quark.cn/s/c2324deaa028 CINEMA 4D字面意思是4D电影,不过其本身就是3D的表现软件,由德国Maxon Computer开发,以极高的运算速度和…...
IDEA vs Eclipse:使用体验对比
1. 概述 IDEA 和 Eclipse 都是常见的集成开发环境(IDE),用于编写和调试代码。它们都有一些共同的功能,例如代码编辑器、调试器、版本控制等等。但是在具体的使用体验上,它们有很多不同之处。 本文将对 IDEA 和 Eclip…...
新手学SpringCloud前需知道的5点
目录 第一点: 什么是微服务架构 第二点:为什么需要学习Spring Cloud 第三点: Spring Cloud 是什么 第四点: SpringCloud的优缺点 1、SpringCloud优点 2、SpringCloud缺点 第五点: SpringCloud由什么组成 1&…...
Java集合—HashMap为什么2倍扩容 、HashMap的key允许空值而Hashtable却不允许
目录 1. Java集合—HashMap为什么2倍扩容 1.1 从源码分析 2. 为什么HashMap的key允许空值,而Hashtable却不允许 2.1 从源码分析 1. Java集合—HashMap为什么2倍扩容 HashMap的初始容量都是2的n次幂的形式存在的,而扩容也是2倍的原来的容量进行扩容&a…...
国内、外(翻)的新闻网站推荐
也许有很多朋友和我一样,小小螺丝天天关注国家大事,总喜欢在茶余饭后关注下国内外新闻,除了新闻广播和电视之外还能有哪些方式呢?今天就给大家盘点总结一下。 一、国内 1.今日头条:链接:今日头条 推荐等…...
PHP初级教程------------------(2)
目录 运算符 赋值运算符 算术运算符 比较运算符 逻辑运算符 连接运算符 错误抑制符 三目运算符 自操作运算符 编辑 计算机码 位运算符 运算符优先级 流程控制 控制分类 顺序结构 分支结构 If分支 Switch分支 循环结构 For循环 while循环 do-while循环 循环控制 …...
js的递归函数——实现可收放的树形菜单
递归函数实现树形菜单创建假数据或者请求接口数据定义递归函数,处理数据调用函数,渲染页面效果展示完整代码树形菜单是一种常见的网站导航方式,它通常由多个层级的菜单项组成,每个菜单项可以有子菜单项。在JavaScript中࿰…...
如何高效搭建资产管理平台?众安科技告诉你答案是图技术
本⽂整理⾃ NebulaGraph x 阿⾥云计算巢专场中众安保险的⼤数据应⽤⾼级专家曾⼒带来的《众安资产在 NebulaGraph 的应⽤实践》分享,视频⻅链接。 ⼤家好,我是众安数据科学应⽤中⼼的曾⼒,今天很⾼兴在这⾥可以跟⼤家分享 NebulaGraph 在众安…...
使用mybatis-plus-generator配置一套适合你的CRUD
1、maven引入 mybatis-plus-generator 和模板引擎,你也可以使用freemarker之类的,看个人 <!-- mybatisplus代码生成器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactI…...
vue门户网站,滚动到可视化区域展示动画效果方案
1.准备两个工具库: (1.1) animate.css:动画库 (动画效果展示:Animate.css | A cross-browser library of CSS animations.) (1.2)wowjs: 负责滚动到可视化区域ÿ…...
【0180】PG内核读取pg_hba.conf并创建HbaLine记录(1)
文章目录 1. pg_hba.conf文件是什么?2. postmaster何时读取pg_hba.conf?2.1 pg内核使用pg_hba.conf完成客户端认证的原理2.2 读取pg_hba.conf的几个模块3. pg内核读取pg_hba.conf过程3.1 VFD机制获取文件描述符3.2 根据fd读取文件内容相关阅读: 【0178】DBeaver、pgAdmin I…...
【五】线程安全VS线程不安全
1. Java内存模型的特征 Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来建立。下面逐个看下哪些操作实现这三个特性: 1.1 原子性(Atomicity) 由Java内存模型来直接保证的原子性变量操作包括 read、load、assig…...
【大屏设计方案】
大屏设计方案一、非等比放大(填充满整个屏幕)目的屏幕比例大小和设计稿的差的不多目的屏幕比例大小和设计稿的差很多二、等比放大(比如16:9)解决方案之后就可以用rem了,有两种便利的方式:也可以用media 根据不同的屏幕…...
input 标签原生实现数字选择器
在使用开源的UI框架时,实现数字选择器很容易,直接拷贝就行,如iview、elementui...等。但有时项目不使用第三方样式库,这样的话UI控件只能自己实现。笔者就遇到过这样的情况,自己实现数字选择器,下面分享下实…...
大数据项目实战之数据仓库:用户行为采集平台——第3章 用户行为日志
第3章 用户行为日志 3.1 用户行为日志概述 用户行为日志的内容,主要包括用户的各项行为信息以及行为所处的环境信息。收集这些信息的主要目的是优化产品和为各项分析统计指标提供数据支撑。收集这些信息的手段通常为埋点。 目前主流的埋点方式,有代码…...
zookeeper 学习(一):简单认识zookeeper
zookeeper 学习(一):简单认识zookeeper zk官网 zk是什么? highly reliable distributed coordination. 来自官网,高可用的分布式协调服务,应用最多的场景就是用来做其他服务中间件的协调者,我最开始接触zk ,…...
IP 归属用 Ip2region 就够了
文章目录Ip2region 简介是什么特性支持的编程语言案例实操依赖获取IP输入流转化解析IP测试抖音、微博、小红书等各平台相继上线" 网络用户IP地址显示功能", 境外显示 国家, 境内显示到 省市,且该功能无法关闭,IP地址为强…...
最小生成树kruskal-修建公路1
题目描述 L 城一共有 N 个小区。 小明是城市建设的规划者,他计划在城市修 M 条路,每修建一条路都要支付工人们相应的工钱(需要支付的工钱 = 路的长度)。 然而小明所拿到的经费并不够支付修建 M 条路的工钱,于是迫于无奈,他只能将计划改变为修建若干条路,使得 N 个小区之…...
Linux常用命令汇总
一、文件和文件夹操作 1、进入某一文件夹: cd xxx/yyy/简便记忆:改变目录,change directory,cd 2、复制文件到另一个文件: cp xxx/xxx.yyy ddd/rrr.zzz简便记忆:复制,copy,cp 第…...
vue部署包可配置后台接口地址
有时候一个部署包可能要应用于不同服务器,这就需要频繁更换后台地址。 由此引申出了部署包可直接配置后台地址的需求,这样就不需要频繁打包了。 方法 1. public 新增 config.js 文件(会被恶意修改地址,不安全) publi…...
企业电子采购系统:采购过程更规范,更透明
满足采购业务全程数字化, 实现供应商管理、采购需求、全网寻源、全网比价、电子招 投标、合同订单执行的全过程管理。 电子招标采购,是指在网上寻源和采购产品和服务的过程。对于企业和企业主来说,这是个既省钱又能提高供应链效率的有效方法…...
php 修改服务器文件上传大小限制
输入docker cp mlfnginx:/etc/nginx/conf.d/pl.conf .输入vimpl.conf 修改nginx配置文件移动到图中所示位置client_max_body_size 按键盘”i”对图中的xxM修改成需要的大小,然后按”esc”,在按”:wq”,最后按回车键输入docker cp ./pl.con…...
PICO640红外探测器配置模块verilog
目录 一、PICO640 Introduction 二、实现代码 一、PICO640 Introduction PICO640 Gen2™ is a high resolution (640x480 pixels) infrared image sensor for military, surveillance or thermography applications. It makes use of the ULIS latest, state o…...
儒家思想中的修身之道
演讲人:唐明燕 演讲地点:复旦大学光华楼 演讲时间:2024年4月孔子既是儒学创始人,也是传统文化的继承者,这里所说的“传统文化”指的是孔子视角下的夏商周三代礼乐文明。孔子把夏商周三代礼乐文明所蕴含的道德元素突显出来,开创了儒家学派。在古代儒家思想中,有没有道德是…...
Bootstrap Studio for Mac:打造专业级网页设计软件
对于追求高效与品质的设计师和开发者来说,Bootstrap Studio for Mac无疑是最佳选择。它建立在广受欢迎的Bootstrap框架之上,输出干净、语义化的HTML代码。同时,强大的CSS和SASS编辑器,支持自动建议和规则验证,让您的设…...
Linux quotacheck命令教程:如何检查和修复文件系统的磁盘配额(附案例详解和注意事项)
Linux quotacheck命令介绍 quotacheck命令是用于扫描文件系统以检查磁盘配额的一致性。它生成、检查和修复配额文件。这个命令通常在系统引导时运行,或者在手动更改了配额设置后运行。 Linux quotacheck命令适用的Linux版本 quotacheck命令在大多数Linux发行版中…...
2024数维杯数学建模C题思路代码
2024年数维杯&电工杯思路代码在线文档https://www.kdocs.cn/l/cdlol5FlRAdE 这道题想要做出好的结果,必须要结合插值法和分布函数来做,主要还是因为勘探点太少,直接用插值法效果不太好,以下是我做的,函数分布可…...
C中Mysql的基本api接口
一、初始化参数返回值 二、链接服务器三、执行SQL语句注意事项 四、获取结果集4.1mysql_affected_rows和mysql_num_rows4.2mysql_store_result与mysql_free_result注意事项注意事项整体的工作流程 4.3mysql_use_result()4.4mysql_field_count(…...
分布式系统的一致性与共识算法(三)
顺序一致性(Sequential Consistency) ZooKeeper 一种说法是ZooKeeper是最终一致性,因为由于多副本、以及保证大多数成功的ZAB协议,当一个客户端进程写入一个新值,另外一个客户端进程不能保证马上就能读到这个值,但是能保证最终能…...
嵌入式是大坑的说法,是否与学生的信息不对称有关?
在开始前我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 目前也算是在搞嵌入式&#…...
【动态规划】子序列问题II|最长定差子序列|最长的斐波那契数列的长度|最长等差数列|等差数列的划分
一、最长定差子序列 1218. 最长定差子序列 算法原理: 💡细节: 1.正常创建dp表,分析状态转移方程:可能b存在于多个不同的位置,那么要用哪个下标的dp呢? 用最后一个b的,因为用前面的可…...
统计学第2天
参数估计 基本概念 估计量与估计值 估计量:用于估计总体参数的随机变量 如:样本均值,样本比例,样本方差等 例如:样本均值就是总体均值的一个估计量 估计值:估计参数时计算出来的统计量的具体值 如&…...
自定义类加载器如何避免双亲委派模型
自定义类加载器要避免双亲委派模型,通常意味着你需要直接重写 loadClass 方法而不是仅重写 findClass 方法。loadClass 方法是 Java 类加载机制中实现双亲委派模型的关键部分。 要绕过双亲委派模型,你可以在自定义类加载器的 loadClass 方法中直接调用 …...
skimage图像处理(五)
多数量图像处理(批量化处理) 多数量图片内读取指定图片 首先导入skimage.io模块并将其简称为io,导入skimage库中的data_dir模块,用于获取示例图像的目录路径 import skimage.io as io from skimage import data_dir 构建…...
基于Vue和uni-app的增强型单选ccRadioView组件开发
标题:基于Vue和uni-app的增强单选组件ccRadioView的设计与实现 摘要:本文将详细介绍如何使用Vue和uni-app构建一个简单、好用且通用的单选框组件ccRadioView。该组件提供了单选列表的功能,并支持反向传值,方便开发者快速实现单选…...