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

Java【多线程】(6)定时器


目录

1.前言

2.正文

2.1库中定时器

2.2手搓定时器

3.小结


1.前言

哈喽大家好呀,今天继续给大家分享Java中定时器的学习,正文包括定时器的三种实现方式,正文如下。

2.正文

在 Java 中,定时器(Timer)是一种用于在指定时间或周期性地执行任务的工具。Java 提供了多种定时器实现方式,包括 TimerTimerTaskScheduledExecutorService。

2.1库中定时器

最基础版的实现方式:

public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("hello 3000");}}, 3000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("hello 1000");}}, 1000);}

执行流程

  1. 创建Timer实例

    • Timer timer = new Timer() 创建一个新的定时器

    • Timer内部会启动一个后台线程(非守护线程)来执行定时任务

  2. 调度第一个任务

    • 延迟3000毫秒后执行,输出"hello 3000"

    • 任务被封装为TimerTask对象

  3. 调度第二个任务

    • 延迟1000毫秒后执行,输出"hello 1000"

    • 虽然代码中先注册了3000ms的任务,但实际会先执行1000ms的任务


关键特性

  1. 执行顺序

    • Timer内部维护了一个任务队列,按执行时间排序

    • 即使先注册长时间延迟的任务,短延迟的任务也会优先执行

  2. 单线程执行

    • 所有任务都在同一个线程中顺序执行

    • 如果一个任务执行时间过长,会影响后续任务的准时执行

  3. 非守护线程

    • Timer创建的线程是非守护线程

    • 即使main方法结束,Timer线程仍会继续运行,直到所有任务完成

进阶版利用线程池实现定时器: 

public static void main(String[] args) {// 1. 创建线程池大小为3的定时任务执行器ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);// 2. 定义要执行的任务(Lambda表达式实现Runnable接口)Runnable task = () -> {System.out.println(Thread.currentThread().getName());};// 3. 以固定速率调度任务executor.scheduleAtFixedRate(task, 1, 3, TimeUnit.SECONDS);
}

核心组件详解


1. ScheduledExecutorService

  • 功能:Java 5引入的定时任务接口,比传统Timer更强大

  • 优势

    • 基于线程池,支持多任务并发执行

    • 提供更灵活的调度方式

    • 更好的异常处理机制

2. Executors.newScheduledThreadPool(3)

  • 创建包含3个线程的定时任务线程池

  • 线程池参数说明:

    • 核心线程数=3(本例中)

    • 适合执行大量短期定时任务

    • 线程可重复利用,避免频繁创建销毁开销

3. scheduleAtFixedRate方法

方法签名:

ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit
)

 参数说明:

  1. command:要执行的任务(Runnable实现)

  2. initialDelay:首次执行的延迟时间

  3. period:连续执行之间的周期

  4. unit:时间单位(本例为秒)


执行流程分析

  1. 初始化阶段

    • 创建包含3个工作线程的线程池

    • 定义打印当前线程名的任务

  2. 任务调度

    • 1秒后首次执行任务

    • 之后每3秒固定执行一次

    • 执行线程可能不同(由线程池分配)

  3. 输出示例

    pool-1-thread-1
    pool-1-thread-2
    pool-1-thread-3
    pool-1-thread-1
    ...

2.2手搓定时器

分为三个类:任务类,定时器类,测试类最后附上总代码:

/*** 自定义定时任务类,实现了Comparable接口用于优先级队列排序*/
class MyTimerTask implements Comparable<MyTimerTask> {private Runnable task;  // 实际要执行的任务private long time;      // 任务执行的时间戳(毫秒)/*** 构造函数* @param task 要执行的任务* @param delay 延迟时间(毫秒)*/public MyTimerTask(Runnable task, long delay) {this.task = task;this.time = System.currentTimeMillis() + delay; // 计算绝对执行时间}/*** 实现Comparable接口,用于优先级队列排序* @param o 另一个定时任务* @return 比较结果*/@Overridepublic int compareTo(MyTimerTask o) {return (int) (this.time - o.time); // 按执行时间排序}/*** 获取任务执行时间* @return 执行时间戳*/public long getTime() {return this.time;}/*** 执行任务*/public void run() {task.run(); // 委托给实际的Runnable执行}
}
/*** 自定义定时器实现*/
class MyTimer {// 优先级队列,按执行时间排序,保证最早执行的任务在队首private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();// 用于线程同步的锁对象private Object locker = new Object();/*** 调度任务方法* @param task 要执行的任务* @param delay 延迟时间(毫秒)*/public void schedule(Runnable task, long delay) {synchronized (locker) {// 创建定时任务并加入队列MyTimerTask myTimerTask = new MyTimerTask(task, delay);queue.offer(myTimerTask);// 通知工作线程有新任务加入locker.notify();}}/*** 定时器构造函数*/public MyTimer() {// 创建工作线程Thread t = new Thread(() -> {try {while (true) {  // 无限循环处理任务synchronized (locker) {// 队列为空时等待while (queue.isEmpty()) {locker.wait();}// 获取但不移除队首任务MyTimerTask task = queue.peek();long currentTime = System.currentTimeMillis();if (currentTime < task.getTime()) {// 还未到执行时间,等待剩余时间locker.wait(task.getTime() - currentTime);} else {// 执行任务并从队列移除task.run();queue.poll();}}}} catch (InterruptedException e) {e.printStackTrace();}});t.start();  // 启动工作线程}
}
/*** 定时器测试类*/
public class demoTime {public static void main(String[] args) {MyTimer timer = new MyTimer();  // 创建定时器// 添加3个定时任务timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 3000");}}, 3000);  // 3秒后执行timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 2000");}}, 2000);  // 2秒后执行timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 1000");}}, 1000);  // 1秒后执行}
}
import java.util.PriorityQueue;class MyTimerTask implements Comparable<MyTimerTask>{private Runnable task;private long time;public MyTimerTask(Runnable task, long time) {this.task = task;this.time = time;}@Overridepublic int compareTo(MyTimerTask o) {return (int) (this.time - o.time);}public long getTime(){return this.time;}public void run(){task.run();}
}class MyTimer{private PriorityQueue <MyTimerTask> queue = new PriorityQueue<>();private Object locker = new Object();public void schedule(Runnable task,long delay){synchronized (locker){MyTimerTask myTimerTask = new MyTimerTask(task,System.currentTimeMillis() + delay);queue.offer(myTimerTask);locker.notify();}}public MyTimer(){Thread t = new Thread(()-> {try {while (true) {synchronized (locker) {while (queue.isEmpty()) {locker.wait();}MyTimerTask task = queue.peek();if (System.currentTimeMillis() < task.getTime()) {locker.wait(task.getTime() - System.currentTimeMillis());} else {task.run();queue.poll();}}}} catch (InterruptedException e) {e.printStackTrace();}});t.start();}
}public class demoTime {public static void main(String[] args) {MyTimer timer = new MyTimer();timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 3000");}}, 3000);timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 2000");}}, 2000);timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 1000");}}, 1000);}
}

3.小结

今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,你的支持就是对我最大的鼓励,大家加油!

相关文章:

Java【多线程】(6)定时器

目录 1.前言 2.正文 2.1库中定时器 2.2手搓定时器 3.小结 1.前言 哈喽大家好呀&#xff0c;今天继续给大家分享Java中定时器的学习&#xff0c;正文包括定时器的三种实现方式&#xff0c;正文如下。 2.正文 在 Java 中&#xff0c;定时器&#xff08;Timer&#xff09;…...

Epub转PDF软件Calibre电子书管理软件

Epub转PDF软件&#xff1a;Calibre电子书管理软件 一款好用的电子书管理软件&#xff0c;可快速导入电脑里的电子书并进行管理&#xff0c;支持多种格式&#xff0c;阅读起来非常方便。同时也有电子书格式转换功能。 第一步&#xff1a;添加电子书 将需要转换的电子书添加到…...

使用FastExcel时的单个和批量插入的问题

在我们用excel表进行插入导出的时候&#xff0c;通常使用easyexcel或者FastExcel&#xff0c;而fastexcel是easy的升级版本&#xff0c;今天我们就对使用FastExcel时往数据库插入数据的业务场景做出一个详细的剖析 场景1 现在我们数据库有一张组织表&#xff0c;组织表的字段…...

nginx https配置

一.https配置 HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议&#xff0c;主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密&#xff0c;实现互联网传输安全保护。 1.生成证书 openssl genrsa -des3 -out server.key 20…...

git --- cherry pick

git --- cherry pick cherry pick cherry pick Cherry Pick 是 Git 中的一个操作&#xff0c;它允许你选择某个分支的某次&#xff08;或多次&#xff09;提交&#xff0c;并将其应用到当前分支&#xff0c;而不会合并整个分支的所有更改。 cherry pick 的作用 只提取某个特定的…...

虚拟机安装linux系统无法上网的解决方法

在虚拟环境中运行Linux系统时&#xff0c;有时会遇到网络连接问题&#xff0c;特别是在使用虚拟机软件如VMware或VirtualBox时。本文将详细介绍一种针对“虚拟机安装Linux系统无法上网”问题的解决方案&#xff0c;以CentOS 6.5为例&#xff0c;适用于其他基于NAT模式的虚拟机环…...

北大人工智能研究院朱松纯:“中国的AI叙事” 存在认知偏差

3月29日&#xff0c;在2025中关村论坛通用人工智能论坛上&#xff0c;北京通用人工智能学院院长&#xff0c;北京大学人工智能研究院、智能学院院长朱松纯表示&#xff0c;目前&#xff0c;行业对AI的讨论几乎被大模型能力所占据&#xff0c;而基础学科、原始创新与智能本质的研…...

Java高频面试之集合-20

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;讲讲 HashSet 的底层实现&#xff1f; HashSet 是 Java 集合框架中用于存储唯一元素的高效数据结构&#xff0c;其底层实…...

使用Qemu模拟32位ARM系统

一、环境 实验环境如下&#xff1a; 主机&#xff1a;x86_64 操作系统&#xff1a;Ubuntu 20.04.6 LTS Qemu版本&#xff1a;QEMU emulator version 4.2.1 Linux内核版本&#xff1a;linux-4.4.240 Busybox版本&#xff1a;busybox-1.35.0二、前置准备 下载 linux-4.4.240 源…...

【初阶数据结构】栈

文章目录 一、概念与结构 二、栈的实现 栈的定义 1.初始化 2.入栈 3.判断栈是否为空 4.出栈 5.取栈顶元素 6.获取栈中有效元素个数 2.销毁 三、完整码源 总结 一、概念与结构 栈&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据…...

docker-compose部署prometheus+grafana+node_exporter

目录 docker-compose文件 配置文件 文件层级关系&#xff0c;docker-compose和配置文件位于同级目录 node_exporter页面json文件 涉及离线包 一.docker-compose文件 [rootsulibao prometheus]# cat docker-compose.yml version: 3services:prometheus:image: registry.c…...

maya调整全局关节显示大小

请按以下步骤操作&#xff1a; 在 Maya 主菜单栏中&#xff0c;找到 Display (显示) 菜单。 在 Display 菜单下&#xff0c;找到 Animation (动画) 子菜单。 在 Animation 子菜单中&#xff0c;点击 Joint Size... (关节大小...)。 这时会弹出一个小窗口或者直接在界面上出现…...

“屏幕“的实现_程序中如何将数据映射到硬件_C++实战

前言 程序里的数据,最后都需要将数据对象写入硬件.C/C最大的优势体现也是在这里,他既是高级语言方便被程序员使用,又能和硬件沟通. 引入 以"屏幕"的实现,总结数据映射到硬件的代码写法 分析 软件部分 1.屏幕是数据对象---一切都是数据,一切都是对象;数据有类型,屏…...

R --- Error in library(***) : there is no package called ‘***’ (服务器非root用户)

步骤 步骤一&#xff1a;在自己目录下创建R包安装路径步骤二&#xff1a;配置用户本地的R库路径步骤三&#xff1a;安装缺失的包&#xff08;在终端&#xff09;步骤四&#xff1a;验证安装 步骤一&#xff1a;在自己目录下创建R包安装路径 mkdir -p ~/R_libs步骤二&#xff1…...

Go中的逃逸分析

什么是逃逸&#xff1f; 逃逸是指一个变量本来应该分配在栈&#xff08;stack&#xff09;上&#xff0c;但由于某些原因&#xff0c;最终被分配到了堆&#xff08;heap&#xff09;上。 类比&#xff1a; 栈就像一个临时的快餐盒&#xff0c;用来存放短期使用的数据。堆就像…...

解决 Android AGP 最新版本中 BuildConfig 报错问题

在最新版本的 Android Gradle Plugin (AGP) 中&#xff0c;Google 对构建系统做了不少改动&#xff0c;可能会导致一些与 BuildConfig 相关的问题。以下是常见问题及解决方案&#xff1a; 常见问题及修复方法 1. BuildConfig 类完全缺失 原因&#xff1a;AGP 8.0 默认不再为库模…...

Rollup系列之安装和入门

Rollup ‌Rollup.js‌的主要用途是将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它特别适用于将ES模块编译成不同的模块形式&#xff0c;如AMD、CommonJS、UMD等&#xff0c;以便在不同的环境中使用‌。 Rollup的应用场景与好处&#xff1a; 插件或…...

Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API

KRaft 全面替代 ZooKeeper Apache Kafka 4.0 是一个重要的里程碑&#xff0c;标志着第一个完全无需 Apache ZooKeeper 运行的主要版本。 通过默认运行在 KRaft 模式下&#xff0c;Kafka 简化了部署和管理&#xff0c;消除了维护单独 ZooKeeper 集群的复杂性。 这一变化显著降…...

MQTT之重复消息(6、在项目中遇到的问题)

项目背景: 在 Spring Boot MQTT 5.0 环境中&#xff0c;RTU设备向SpringBoot平台发送心跳数据、业务监控数据。同时SpringBoot平台可以向RTU设备下发指令&#xff0c;RTU在执行完指令之后向平台发送响应数据。 问题一、SpingBoot平台发送指令给RTU设备&#xff0c;RTU设备能够…...

8、linux c 信号机制

一、信号概述 1. 信号概念 信号是一种在软件层次上对中断机制的模拟&#xff0c;是一种异步通信方式。信号的产生和处理都由操作系统内核完成&#xff0c;用于在进程之间传递信息或通知某些事件的发生。 2. 信号的产生 信号可以通过以下方式产生&#xff1a; 按键产生&…...

Set,Map,WakeSet,WakeMap

简介 Set、Map、WeakMap 和 WeakSet 是 ES6 引入的高级数据结构&#xff0c;它们的底层实现和特性与传统的对象和数组有显著差异 强弱引用了解: link Set ​Set对象 是一种用于存储 ​唯一值 的可迭代集合&#xff0c;可存储任意类型的值&#xff08;原始值、对象引用等&…...

NSSCTF(MISC)—[HITCTF 2021]PNG

相应的做题地址&#xff1a;https://www.nssctf.cn/problem/819 import zlib from Crypto.Cipher import AES import base64 def decode(data, key, iv): cipher AES.new(key, AES.MODE_CBC, iv) decryptByts base64.b64decode(data) msg cipher.decrypt(decryptByts) msgs…...

只出现一次的数字

这个题目动了点脑筋&#xff0c;由于它们时无序的&#xff0c;所以我们如果去找的话比较费劲&#xff0c;可能要循环嵌套再嵌套&#xff0c;所以我们先利用库中自带的sort函数进行排序&#xff0c;把这些数从小到大以此排列&#xff0c;然后我们进行判断哪个数出现了一次即可。…...

【编程中的框架】

编码中常用的框架及其使用方法和好处 框架&#xff08;Framework&#xff09;是一种为解决特定问题而设计的软件架构&#xff0c;它提供了一组预定义的组件、模式和工具&#xff0c;帮助开发者更高效地构建应用程序。框架通常不仅仅是方法库&#xff0c;它们提供了一种结构化的…...

Python-常用关键字

基础值 1. False - 意义&#xff1a;布尔类型假值&#xff08;首字母大写&#xff09; - 用法示例&#xff1a; if condition is False: print("条件为假") 2. True - 意义&#xff1a;布尔类型真值&#xff08;首字母大写&#xff09; - 用法示例&…...

【计算机网络】DHCP工作原理

DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 &#xff08;1&#xff09;DHCP DISCOVER客户机请求 IP 地址&#xff1a; 当一个 DHCP 客户机启动时&#xff0c;客户机还没有 IP 地址&#xff0c;所以客户机要通过 DHC…...

python 原型链污染学习

复现SU的时候遇到一道python原型链污染的题&#xff0c;借此机会学一下参考&#xff1a; 【原型链污染】Python与Jshttps://blog.abdulrah33m.com/prototype-pollution-in-python/pydash原型链污染 文章目录 基础知识对父类的污染命令执行对子类的污染pydash原型链污染打污染的…...

量子计算:未来计算技术的革命性突破

在当今科技飞速发展的时代&#xff0c;量子计算正逐渐从理论走向实践&#xff0c;成为计算技术领域最具潜力的革命性突破之一。与传统计算机基于二进制的计算方式不同&#xff0c;量子计算利用量子比特&#xff08;qubit&#xff09;的叠加和纠缠特性&#xff0c;能够在处理复杂…...

Maven:Java项目构建与依赖管理工具

Maven 是什么 Maven 将项目开发过程和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09;&#xff0c;本质上是一个项目管理工具。Maven 主要用于Java项目的依赖管理、编译、测试、打包和部署等操作。 Maven的核心设计围绕标准化和自动化&#xff0c;通过一系列约定和…...

内积相似系数——内积度量相似系数

内积与相似系数 内积&#xff08;Inner Product&#xff09; 内积&#xff08;Inner Product&#xff09;&#xff0c;也称为点积&#xff08;Dot Product&#xff09;或标量积&#xff0c;两个向量点积的结果是一个标量&#xff08;通常是实数或复数&#xff09;。 内积&…...

问题:md文档转换word,html,图片,excel,csv

文章目录 问题&#xff1a;md文档转换word&#xff0c;html&#xff0c;图片&#xff0c;excel&#xff0c;csv&#xff0c;ppt**主要职责****技能要求****发展方向****学习建议****薪资水平** 方案一&#xff1a;AI Markdown内容转换工具打开网站md文档转换wordmd文档转换pdfm…...

GET 和 POST 有什么区别

GET 和 POST 是 HTTP 协议中两种最常见的请求方法&#xff0c;它们在用途、安全性、数据传递方式等方面有显著的区别。以下是它们的主要区别&#xff1a; 1. 用途 • GET&#xff1a; • 用于从服务器获取资源&#xff08;数据&#xff09;。 • 是一种无状态的操作&#xf…...

AI Agent 人工智能相关公开比赛汇总

参与 AI 相关比赛是提升技术能力、接触前沿算法、积累项目经验的绝佳方式。以下是全球知名的比赛&#xff0c;以及适合不同水平选手的竞赛分类。 1. 全球知名 AI & 计算机竞赛 (1) Kaggle 竞赛&#xff08;Kaggle Competitions&#xff09; 简介&#xff1a;全球最知名的…...

Java 多线程编程之 Object.wait 方法(工作原理、高级特性、notify 方法与 notifyAll 方法)

一、wait 方法 1、基本介绍 wait 方法是 Java 中每个对象都拥有的方法&#xff0c;它继承自 Object 类 wait 方法使当前线程进入等待状态&#xff0c;直到其他线程调用该对象的 notify 方法或 notifyAll 方法 wait 方法必须在同步代码块中使用&#xff0c;否则抛出 Interrup…...

python下载m3u8格式视频

一、安装 m3u8库 pip install requests pip install requests m3u8 二、编码实现 import os import re import requests import subprocess# 下载ts文件 def down_ts_file(base_url, m3u8_url, download_dir):# 从m3u8文件中获取所有ts的分片名称信息response requests.get…...

3.30 代码随想录第三十天打卡

准备:01背包理论基础&#xff08;二维&#xff09; 1.有n个物品每个物品只有一个 2.完全背包是有n个物品每个物品有无限多个 3.多重背包是有n个物品每种物品个数各不相同 &#xff08;1&#xff09;题目描述&#xff1a; &#xff08;2&#xff09;解题思路&#xff1b; 1…...

01 相机标定与相机模型介绍

学完本文,您将了解不同相机模型分类、内参意义,及对应的应用代码模型 标定的意义 建模三维世界点投影到二维图像平面的过程。标定输出的是相机模型。 相机模型 相机模型可以解理解为投影模型 +...

鸿蒙学习手册(HarmonyOSNext_API16)_应用开发UI设计:相对布局

概述 RelativeContainer 就像个「智能拼图板」&#xff0c;帮你把界面组件像拼图一样自由组合&#xff0c;不用一层套一层地堆叠。每个组件可以直接「贴」到其他组件旁边或容器边缘&#xff0c;省去多层嵌套的麻烦&#xff0c;让复杂界面更高效。 举个接地气的例子 &#x1f3…...

关于为什么使用redis锁,不使用zk锁的原因

实际项目中&#xff0c;redis一直是最为稳定、可靠的部分&#xff0c;你根本不用担心redis本身的问题。至于ap模型的问题&#xff0c;绝大多数分布式锁只是用于避免一些极端情况的&#xff0c;若单一数据会有那么高的并发量你还加锁&#xff0c;那就要考虑这个业务场景设置的合…...

string的基本使用

C基础格式 C语言语法STL。蓝桥杯选用C11的版本。 #include <bits/stdc.h> #include <iostream> using namespace std; int main() {cout<<"Hello World!"<<endl;printf("Hello World!");return 0; } 基本数据类型 #include &l…...

论文阅读笔记——PointVLA: Injecting the 3D World into Vision-Language-Action Models

PointVLA 论文 现有的 VLA 基于 2D 视觉-语言数据表现良好但缺乏 3D 几何先验导致空间推理缺陷。传统方案&#xff1a;1&#xff09;3D->2D 投影&#xff0c;造成几何信息损失&#xff1b;2&#xff09;3D 数据集少。PointVLA 保留原有 VLA&#xff0c;提取点云特征&#xf…...

MySQL数据库精研之旅第四期:解锁库操作高阶技能

专栏&#xff1a;MySQL数据库成长记 个人主页&#xff1a;手握风云 目录 一、查看所有表 1.1. 语法 二、创建表 2.1. 语法 2.2. 示例 2.3. 表在磁盘上对应的⽂件 三、查看表结构 3.1. 语法 3.2. 示例 四、修改表 4.1. 语法 4.2. 示例 五、删除表 5.1. 语法 5.2.…...

自定义一个C语言字符串取整函数

一、字符串取整的主要思路 1、遍历每个字符&#xff1b; 2、获得0到9的字符对应的整数值&#xff1b; 3、把对应位置的十进制权重相乘&#xff1b; 4、把所有的相乘结果相加&#xff1b; 5、返回相加结果&#xff1b; 二、主要代码 // 主要是把十进制的整数字符转成十进制变量值…...

Ruby 命令行选项

Ruby 命令行选项 概述 Ruby 是一种广泛使用的编程语言,它拥有强大的命令行工具,可以帮助开发者进行各种任务。了解 Ruby 的命令行选项对于提高开发效率至关重要。本文将详细介绍 Ruby 的常用命令行选项,帮助开发者更好地利用 Ruby 的命令行功能。 Ruby 命令行选项概述 R…...

3.29:数据结构-绪论线性表-上

一、时间复杂度 1、ADT 2、定义法计算时间复杂度&#xff1a;统计核心语句的总执行次数 &#xff08;1&#xff09;例题1&#xff0c;与2022年的真题对比着写 此题关键在于求和公式的转化&#xff0c;类型为&#xff1a;线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…...

【百日精通 JAVA | SQL篇 | 第一篇】初识数据库

一、数据库是什么&#xff1f; 数据库是一类软件&#xff0c;数据库的作用用于管理系统(这是一款成品软件&#xff0c;内部应用了很多数据结构)。 二、数据库分为两大类 1.关系型数据库 对于数据的要求比较严格 通常是以表格的方式来组织数据的。(和Excel差不多) 典型代表…...

yum repolist all全部禁用了 怎么办

文章目录 步骤思考解决yum仓库全部被禁用的问题步骤思考: 检查仓库状态:运行yum repolist all,查看所有仓库的启用状态。 被禁用的仓库会显示为disabled。 启用所有仓库:可以逐一启用,或者使用命令批量启用。 例如使用yum-config-manager --enable ‘*’,但需要注意是否有…...

gnvm切换node版本号

1. gnvm下载官网 GNVM - Node.js version manager on Windows by Go 2. 安装 2.1 不存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到任意文件夹&#xff0c;并将此文件夹加入到环境变量 Path。 2.2 存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到 Node.js 所在的文件夹。 2.…...

maven高级

1.分模块开发与设计 理解并实现分模块开发 能够使用聚合工程快速构建项目 能够使用继承简化项目配置 能够根据需求配置生成、开发、测试环境&#xff0c;并在各个环境间切换运行 了解Maven的私服 1.1分模块开发&#xff1a;将别人写好的功能或是包直接使用&#xff0c; 引入依赖…...

MyBatis-Plus 多数据源配置与读写分离实战

一、引言 在实际的项目开发中&#xff0c;我们常常会遇到需要操作多个数据库的情况&#xff0c;比如纯粹多库、读写分离、一主多从、混合模式等。本文将详细介绍如何使用 MyBatis-Plus 实现纯粹多库的场景&#xff0c;并探讨读写分离的实现思路。 二、环境准备 开发工具&…...