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

Java线程

目录

一、线程入门

二、线程同步

三、死锁

四、线程的方法

五、线程的流程图

六、线程池


一、线程入门

1.进程:每一个软件都是一个进程。

2.线程:进程是由多个线程组成的。

3.进程和线程的关系:一个进程是对应一个或者是多个线程的。

4.我们所有的操作都是由CPU来执行的,但是CPU一次只能处理一个操作,所以我们在打开了多个程序后,只是看似是一起运行的,实际上还是在单个运行:

(1)那么多个程序为什么可以看似是一起运行的,这是因为CUP把执行的时间分成了时间片段;

(2)比如:把1秒分成了多个时间片段,其中一部分时间片段是执行一个程序,而另一部分时间片段又去执行另一个程序,因为时间片段很快,我们是很难用肉眼去分辨的,所以在1秒内,多个程序是可以看作是一起运行的;

  • 秒后面的单位:微秒 -> 纳秒

5.线程类:Thread类

(1)创建线程:new一个线程类,但是一般情况下,我们是不会这么写的,我们会通过匿名内部类的方式来写;

Thread t = new Thread(); // 创建线程  -- 初始化

(2)使用匿名内部类的方法来创建线程;

// 创建线程
Thread t = new Thread(){//运行状态  -->>  抢到了CPU资源// 重写run方法public void run(){}
};

(3)子线程;

  • 在一个线程中创建了另一个线程,那么被创建出来的那个线程就是那个已有线程的子线程;

(4)线程类中的常用方法;

  • 获取当前线程的名字:Thread.currentThread().getName();
  • System.out.println(Thread.currentThread().getName());
  • 启动线程:线程类的对象名.start();
    • 注意线程只有在启动后才会执行里面的代码;
    • // 就绪状态 -->>  可以开始去抢占CPU的资源了
      t.start(); // 启动线程

(5)设置线程的优先级:线程类的对象名.setPriority(Thread的静态常量);

  •    t.setPriority(Thread.MAX_PRIORITY);
  • Thread.MAX_PRIORITY --> 10;
  • Thread.MIN_PRIORITY --> 1;
  • Thread.NORM_PRIORITY --> 5;
  • 设置线程为精灵线程,也可以称为守护线程或者后台线程:线程类的对象名.setDaemon(true);
    • 作用:如果将一个子线程设置为精灵线程,那么这个子线程会在主线程停止执行后一起停止,就算是子线程还没有执行完也会被强制停止;
    • t.setDaemon(true);

6.线程的状态:

(1)初始化状态:创建线程对象;

// 创建一个线程类  --  初始化
Thread t = new Thread();

(2)就绪状态:调用start()方法;

  • 就绪状态代表线程可以开始去抢占CPU资源了;
  • // 启动线程  --  就绪状态
    t.start();

(3)运行状态:执行run()方法;

  • 代表是抢到了CPU资源,开始执行run()方法;
  • // 创建线程
    Thread t = new Thread(){ // 运行状态  -->>  抢到了CPU资源// 执行run方法public void run(){}
    };

(4)死亡状态:run()方法运行结束;

(5)阻塞状态:调用sleep()方法的时候;

  • sleep()方法的括号中的参数是以毫秒为单位的;
  • Thread.sleep(1);

7.实现线程有三种方法:

(1)实现接口:要将一个普通类变成线程类需要实现Runnable接口;

  • 使用实现接口的方法,那么这个普通类就变成了一个可以被线程类操作的类,然后使用线程类去完成一些操作;
  • 在实现接口后,这个普通类只是可以被线程类操作了,并没有变成一个线程类;
  • public class Thread2 implements Runnable {@Overridepublic void run() {}
    }

(2)继承类:要将一个普通类变成线程类需要继承Thread类并重写run()方法;

  • 使用继承类的方法,那么将一个普通类变成线程类之后,这个普通类就是一个线程类,它和线程类的用法没有区别;
  • public class Thread1 extends Thread {@Overridepublic void run() {}
    }

(3)线程池:线程池用来管理线程,下面会介绍;

8.实现线程的方法中,实现接口和继承类这个两个方法推荐使用实现接口的方法,因为java只能单继承,但是可以多实现。

二、线程同步

1.同步代码块:

(1)格式:synchronized(锁旗标){};

(2)含义:在同步块中的代码,同时只能有一个线程去执行;

public class Ticket implements Runnable {int number = 100;@Overridepublic void run() {while (true) {// 同步代码块synchronized ("") {if (number > 0) {// 还有票try {Thread.sleep(50);// 模拟卖票时间} catch (InterruptedException e) {e.printStackTrace();}System.out.println("同步代码块:" + Thread.currentThread().getName() + "卖了" + number-- + "张票");}}}}
}

(3)注意:synchronized括号中可以放字符串或对象,只有括号中是同一个字符串或同一个对象时才可以达到同步的效果,一般括号中放的是空字符串或者this对象;

2.同步方法:

(1)同步方法锁住的是当前对象;

public class Ticket implements Runnable {int number = 100;@Overridepublic void run() {while(true){sale();}}// 卖票的方法// 同步方法 -->>  锁住的是当前对象public synchronized void sale(){//thisif (number > 0) {// 还有票try {Thread.sleep(50);// 模拟卖票时间} catch (InterruptedException e) {e.printStackTrace();}System.out.println("同步方法:" + Thread.currentThread().getName() + "卖了" + number-- + "张票");}}
}

3.总结:

(1)每个对象身上都有一把锁,它的状态不是1就是0;

(2)我们锁住的东西称为锁旗标,如:this,空字符串都可以称为锁旗标;

(3)想要线程同步,只需要让多个线程拥有同一个锁旗标;

三、死锁

1.互相拿着对方的锁,但是需要对方来解锁;

public class Ticket implements Runnable {int number = 100;String s = "a";@Overridepublic void run() {while (true) {if ("a".equals(s)) {while (true) {sale();}} else {while (true) {synchronized ("") {if (number > 0) {// 还有票try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("同步代码块:" + Thread.currentThread().getName() + "卖了" + number-- + "张票");// 会造成死锁synchronized (this){}}}}}}}//卖票的方法//同步方法 -->>  锁住的是当前对象public synchronized void sale(){//thisif (number > 0) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("同步方法:" + Thread.currentThread().getName() + "卖了" + number-- + "张票");//会造成死锁synchronized (""){}}}
}public class Demo {public static void main(String[] args) throws InterruptedException {Ticket ticket = new Ticket();Thread t1 = new Thread(ticket);Thread t2 = new Thread(ticket);Thread t3 = new Thread(ticket);Thread t4 = new Thread(ticket);t1.start();t2.start();Thread.sleep(1);t.s = "b";t3.start();t4.start();}
}

四、线程的方法

1.挂起:线程对象名.suspend();

(1)此方法已过时,作为了解。

Thread t1 = new Thread();
t1.suspend();

2.取消挂起:线程对象名.resume();

(1)此方法已过时,作为了解。

Thread t1 = new Thread();
t1.resume();

3.礼让:线程对象名.yield();

(1)线程在抢到CPU的资源后,会让出来,但是在让出来后,还会和其他线程去抢CPU的资源(只让一次)。

Thread t1 = new Thread();
t1.yield();

4.加入:线程对象名.join();

(1)在一个线程执行的途中,可以加入另一个正在执行的线程,然后正在执行的线程就会停下来让新加入的线程先执行完,等到新加入的线程执行完毕后,原来的线程才会继续执行。

public class ThreadB extends Thread {@Overridepublic void run() {for (int i = 0; i < 100; i++) {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "===" + i);}}public static void main(String[] args) {ThreadB b = new ThreadB();ThreadA a = new ThreadA(b);a.start();b.start();}
}public class ThreadA extends Thread {private ThreadB b;public ThreadA(ThreadB b){this.b = b;}@Overridepublic void run() {for (int i = 0; i < 100; i++) {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}if(i == 10){try {//当A线程执行到10的时候,将B线程加入进来b.join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "===" + i);}}
}

5.休息/等待:线程对象名.wait()或者this.wait();

(1)让一个正在执行的线程停止执行,进入休息状态。

6.唤醒当前线程:线程对象名.notify()或者this.notify();

(1)如果当前线程是休息状态,则唤醒当前线程。

7.唤醒所有线程:线程对象名.notifyAll()或者this.notifyAll();

(1)唤醒全部已经进入休息状态的线程。

8.使用生产者和消费者案例来解释wait和notifyAll方法,notify方法和notifyAll方法使用方法差不多,一个是唤醒当前线程,一个是唤醒全部线程;

/**
* 产品
*/
public class Product {int number = 0;int max = 100;public synchronized void add(){if(number < max){number++;System.out.println("生产了一件产品,现在的数量是:" + number);//当生产了一件产品的时候,唤醒全部线程开始消费this.notifyAll();}else {try {//当现有的产品数量大于等于最大的库存容量时,休息一下this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}public synchronized void remove(){if(number > 0){number--;System.out.println("消费了一件产品,现在的数量是:" + number);//当消费了一件产品的时候,唤醒全部线程开始生产this.notifyAll();}else {try {//当没有产品时,先休息一下this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}
}/*** 生产者*/
public class Produce extends Thread {Product pro = null;public Produce(Product pro){this.pro = pro;}@Overridepublic void run() {while (true) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}pro.add();}}
}/*** 消费者*/
public class Saler extends Thread {Product pro = null;public Saler(Product pro){this.pro = pro;}@Overridepublic void run() {while (true) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}pro.remove();}}
}public class Test {public static void main(String[] args) {Product pro = new Product();new Produce(pro).start();new Produce(pro).start();new Saler(pro).start();}
}

五、线程的流程图

六、线程池

1.线程池的概念:

(1)将多个线程放入到一个类似池子的空间中,然后如果要使用某个线程,就从线程池中取出使用,使用完成后再将线程放入到线程池中。

2.Java通过Executors提供了四种线程池:

(1)newCacheThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可以灵活的回收空闲线程,若没有可回收的线程,则会新创建一个;

  • 可缓存的线程池为无限大,当执行第二个任务时第一个任务已经完成,第二个任务会复用第一个任务的线程,而不用每次都新创建一个线程;
  • 使用execute方法来执行线程;
  • // 可缓存的线程池,线程池为无限大,当执行第二个任务时如果第一个任务已经完成,会复用第一个任务的线程,而不用每次新建线程
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    for (int i = 0; i < 10; i++) {final int index = i;try {Thread.sleep(1000 * index);} catch (InterruptedException e) {e.printStackTrace();}cachedThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println(index);}});
    }

(2)newFixedThreadPool:创建一个固定长度的线程池,可控制线程的最大并发数,如果超出,线程会在队列中等待;

  • 创建一个固定长度的线程池,这个线程池的长度是固定的,每次执行线程的时候,会按最大长度去限制执要行线程的个数;
    • 如果最大长度为3,则一次性最多只能执行3个线程,如果为5,则一次性最多只能执行5个线程;
  • 使用execute方法来执行线程;
  • // 创建固定长度的线程池,因为线程池的大小为3,每个任务休息3秒之后,会打印三个数字,所以是每三秒打印三个数字
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);for (int i = 0; i < 10; i++) {final int index = i;fixedThreadPool.execute(new Runnable() {@Overridepublic void run() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(index);}});}

(3)newScheduledThreadPool:创建一个定长的线程池,支持定时及周期任务;

  • 使用schedule方法来定时执行线程,就是让一个线程在多长时间后执行;
  • // 创建一个定长的线程池,支持定时及周期任务执行
    // 定时:表示延迟3秒后执行一次
    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
    scheduledThreadPool.schedule(new Runnable() {@Overridepublic void run() {System.out.println("delay 3 seconds");}
    },3, TimeUnit.SECONDS);
  • 使用scheduleAtFixedRate方法来定时及定周期执行线程,就是让一个线程,在多长时间后执行,每多长时间执行一次;
  • // 创建一个定长的线程池,支持定时及周期任务执行
    // 延迟1秒之后,每隔3秒执行一次
    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
    scheduledThreadPool.scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {System.out.println("delay 1 seconds, and execute every 3 seconds");}
    },1,3,TimeUnit.SECONDS);

(4)newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,可以保证所有的任务按照指定的顺序来执行;

  • 创建一个单线程化的线程池,也就是说这个线程池只会创建一个线程,然后使用这个线程去执行各个任务,相当于顺序执行各个任务;
  • 使用execute方法来执行线程;
  • // 创建一个单一的线程池,结果按照执行顺序依次输出,相当于顺序执行各个任务
    ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    for (int i = 0; i < 10; i++) {final int index = i;singleThreadExecutor.execute(new Runnable() {@Overridepublic void run() {System.out.println(index);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}});
    }

相关文章:

Java线程

目录 一、线程入门 二、线程同步 三、死锁 四、线程的方法 五、线程的流程图 六、线程池 一、线程入门 1.进程&#xff1a;每一个软件都是一个进程。 2.线程&#xff1a;进程是由多个线程组成的。 3.进程和线程的关系&#xff1a;一个进程是对应一个或者是多个线程的。…...

JMeter 的 If Controller:开启性能测试的智能大门

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 If Controller&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开灵活测试的大门&#xff0c;让你的测试计划变得更加智能和高效。 一、If Controller 初印象 想象一下&#xff0c;你正在指…...

node内置模块之---os 模块

os 模块的作用 os 模块是 Node.js 的一个核心模块&#xff0c;提供了与操作系统交互的一些功能。它使得 Node.js 应用可以访问操作系统的底层信息&#xff0c;并执行一些系统级的操作&#xff0c;比如文件系统操作、环境变量、进程管理等。 os 模块的相关api 文件系统路径操…...

PgSQL如何用cmd命令行备份和还原数据库

一、备份 备份为压缩的二进制格式&#xff08;通常更快且占用空间更少&#xff09; pg_dump -U username -Fc -h hostname -p port -d dbname -F p -f backup.sql-U username&#xff1a;指定连接数据库的用户名&#xff08;默认是 postgres&#xff09;。-Fc&#xff1a;备…...

neo4j学习笔记

图数据库 图数据库是基于图论实现的一种NoSQL数据库&#xff0c;其数据存储结构和数据查询方式都是图论为基础的&#xff0c;图数据库主要用于存储更多的连接数据。 图论&#xff08;GraphTheory&#xff09;是数学的一个分支。图论以图为研究对象&#xff0c;图论的图是由若干…...

Halcon 显示异常

//For Halcon System HOperatorSet.SetSystem("clip_region", "false"); set_system( clip_region, false) *旋转 hom_mat2d_identity (HomMat2DIdentity1) hom_mat2d_rotate (HomMat2DIdentity1, rad( 90), 0, 0, HomMat2DRotate) affine_trans_region …...

2021年3月多省联考《申论》B卷真题解析

2021年福建公务员考试申论试题&#xff08;乡镇卷&#xff09; 材料一 在传统乡镇布局中&#xff0c;部分乡镇面积小、人口少&#xff0c;但管理机构、干部职数、机构编制、财政投入均不少&#xff0c;行政运行成本较高。合理调整乡镇行政区划&#xff0c;有助于统筹设置乡镇服…...

Mac iTerm2集成DeepSeek AI

1. 去deepseek官网申请api key&#xff0c;DeepSeek 2. 安装iTerm2 AI Plugin插件&#xff0c;https://iterm2.com/ai-plugin.html&#xff0c;插件解压后直接放到和iTerms相同的位置&#xff0c;默认就在/Applications 下 3. 配置iTerm2 4. 重启iTerm2,使用快捷键呼出AI对话…...

主机A与主机B建立TCP连接的三次握手过程

&#xff08; 1 &#xff09;主机 A 的 TCP 向主机 B 发出连接请求 SYN 报文段&#xff08;第一次握手&#xff09;。&#xff08; 1 分&#xff09; &#xff08; 2 &#xff09;一旦包含 SYN 报文段的 IP 数据报到达主机 B &#xff0c; SYN 报文段被从数据报…...

vue3 vite 动态加载路由遇到的问题

记录一下动态加载路由遇到的问题 正常使用import引入静态路由是没问题的 component: () > import(/components/ExampleComponent.vue)动态引入的时候写成import就不行了 由于后端给的路由格式比较反人类…我这边先递归把获取到的数据格式做了一个整合. const processedDa…...

仿生的群体智能算法总结之一(十种)

群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是10种常见的群体智能算法: 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swarm Optimization (PSO) 粒子群优…...

02pandas读取和保存数据的方法

pandas读取和保存数据的方法 一、pandas支持的数据格式二、pandas常用数据读取方法1. 准备工作2. 代码示例1.pandas数据读取常用的方法2. read_excel 方法&#xff08;1&#xff09;read_excel()方法&#xff1a;读取excel文件&#xff08;2&#xff09;head()方法&#xff1a;…...

【STM32项目】智能物联网驱动的生物样本培育与管理辅助系统(完整工程资料源码)

视频功能演示: 智能物联网驱动的生物样本培育与管理辅助系统 目录: 目录 视频功能演示: 目录:...

家教老师预约平台小程序系统开发方案

家教老师预约平台小程序系统将连接学生/家长与家教老师&#xff0c;提供一站式的家教服务预约体验。 一、用户需求分析1、家教老师&#xff1a;希望获得更多的学生资源&#xff0c;通过平台展示自己的教学特长和经验&#xff0c;管理个人日程&#xff0c;接收并确认预约请求&a…...

uniapp 自定义类微信支付键盘 (微信小程序)

效果图 代码: <view class"popups popupsB"><view class"appreciatePrice"><view class"appreciatePriceTitle">赞赏金额</view><view class"appreciatePriceInput flex ac">&#xffe5;<input typ…...

推荐5款局域网IP扫描工具,支持电脑+Android!

在日常网络管理中&#xff0c;快速扫描局域网中的设备和IP地址是一项基本但非常重要的任务。无论是排查网络问题还是进行设备管理&#xff0c;一款好用的 IP 扫描工具都能让你事半功倍。 如何选择适合自己需求的局域网 IP 扫描工具&#xff1f;有哪些功能强大又易于上手的工具…...

第十一章 图论

/* * 题目名称&#xff1a;连通图 * 题目来源&#xff1a;吉林大学复试上机题 * 题目链接&#xff1a;http://t.cn/AiO77VoA * 代码作者&#xff1a;杨泽邦(炉灰) */#include <iostream> #include <cstdio>using namespace std;const int MAXN 1000 10;int fathe…...

算法学习(21)—— BFS解决FloodFill问题

关于FloodFill 关于FloodFill算法&#xff0c;我们之前在dfs章节已经介绍过了&#xff1a;算法学习&#xff08;17&#xff09;—— FloodFill算法-CSDN博客 下面是用bfs宽搜来解决的实例 部分OJ题详解 733. 图像渲染 733. 图像渲染 - 力扣&#xff08;LeetCode&#xf…...

计算机网络基础(7)中科大郑铨老师笔记

应用层 目标&#xff1a;  网络应用的 原理&#xff1a;网络应用协议的概念和实现方面 传输层的服务模型 客户-服务器模式 对等模式(peerto-peer) 内容分发网络  网络应用的 实例&#xff1a;互联网流行的应用层协 议  HTTP  FTP  SMTP / POP3 / IMAP  DNS…...

CSS 之 响应式设计 前世今生

CSS系列文章目录 CSS 之 display 布局属性详解 CSS 之 position 定位属性详解一文搞懂flex布局 【弹性盒布局】 文章目录 CSS系列文章目录一、前言二、历史上的网站布局三、响应式设计之前的灵活布局四、响应式设计五、媒介查询六、灵活网格七、现代布局技术7.1 多栏布局7.2 伸…...

前端,npm install安装依赖卡在sill idealTree buildDeps(设置淘宝依赖)

输入npm i后&#xff0c;一直卡在sill idealTree buildDeps&#xff0c;一动不动 cnpm可以安装成功&#xff0c;但使用cnpm不会生成package-lock.json文件 设置淘宝依赖&#xff0c;依然卡住&#xff0c;挂梯子也不行 解决方法&#xff1a; // 取消ssl验证 set strict-ssl …...

【Rust自学】9.2. Result枚举与可恢复的错误 Pt.1:match、expect和unwrap处理错误

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 9.2.1. Result枚举 通常情况下&#xff0c;错误都没有严重到需要停止整个程序的地步。某个函数之所以运行失败或者是遇到错误通常是由一些…...

[241231] CachyOS 2024 年终总结:性能飞跃与社区繁荣 | ScyllaDB 宣布转向开源可用许可证

目录 CachyOS 2024 年终总结&#xff1a;性能飞跃与社区繁荣ScyllaDB 宣布转向开源可用许可证 CachyOS 2024 年终总结&#xff1a;性能飞跃与社区繁荣 CachyOS 2024 年的最后一个版本 (也是第 13 个版本) 已经发布&#xff0c;同时也迎来了辞旧迎新之际。让我们一起回顾 Cachy…...

9.系统学习-卷积神经网络

9.系统学习-卷积神经网络 简介输入层卷积层感受野池化层全连接层代码实现 简介 卷积神经网络是一种用来处理局部和整体相关性的计算网络结构&#xff0c;被应用在图像识别、自然语言处理甚至是语音识别领域&#xff0c;因为图像数据具有显著的局部与整体关系&#xff0c;其在图…...

java并发之AQS

一、简介 AQS&#xff0c;全称&#xff1a;AbstractQueuedSynchronizer&#xff0c;是一个JDK提供的用于构建锁、同步器等线程协作工具类的框架&#xff0c;内部维护FIFO双向队列&#xff08;双向链表实现&#xff09;。 AQS重要属性&#xff1a; // 表示同步状态。它既可以表…...

Synthesia技术浅析(一)

Synthesia 是一款利用人工智能技术生成视频内容的产品&#xff0c;其中变分自编码器&#xff08;Variational Autoencoder, VAE&#xff09;技术在视频生成过程中起到了关键作用。 1. 变分自编码器&#xff08;VAE&#xff09;概述 变分自编码器&#xff08;VAE&#xff09;是…...

SQL偏移类窗口函数—— LAG()、LEAD()用法详解

SQL偏移类窗口函数&#xff1a;LAG() 和 LEAD() 用法详解 在 SQL 中&#xff0c;偏移类窗口函数 LAG() 和 LEAD() 用于访问当前行的前几行或后几行的值。 1. LAG() 函数 LAG() 函数返回当前行的前几行的数据。 LAG(Expression, OffSetValue, DefaultVar) OVER (PARTITION BY …...

PHP语言的计算机基础

计算机基础与PHP语言入门 在当今信息技术高速发展的时代&#xff0c;计算机已经成为我们日常生活中不可或缺的重要工具。学习计算机基础知识&#xff0c;不仅能增强我们对信息技术的理解&#xff0c;还会为我们后续学习编程语言打下良好的基础。本文将以PHP语言为切入点&#…...

39. 解压报文

题目描述 为了提升数据传输的效率&#xff0c;会对传输的报文进行压缩处理输入一个压缩后的报文&#xff0c;请返回它解压后的原始报文.压缩规则:n[str]&#xff0c;表示方括号内部的str正好重复n次。注意n为正整数(0<n<100)&#xff0c;str只包含小写英文字母&#xff0…...

SpringBoot日志快速集成详解-生产实战

SpringBoot日志快速集成详解 1. 添加依赖2. 创建 logback-spring.xml 配置文件示例 logback-spring.xml 配置&#xff1a; 3. 启用 Spring Boot 自动配置4. 配置 Spring Boot 启动日志级别5. 运行与验证 博文专注于最快速的实战&#xff0c;没有那么多逼逼叨叨的理论&#xff0…...

基于 Node.js 的 ORM(对象关系映射)工具——Sequelize介绍与使用,并举案例分析

便捷性介绍 支持多种数据库&#xff0c;包括 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。Sequelize 提供了丰富的功能&#xff0c;帮助开发者用 JavaScript&#xff08;或 TypeScript&#xff09;代码操作数据库&#xff0c;而无需直接书写 SQL 语句。 Se…...

电子应用设计方案85:智能 AI门前柜系统设计

智能 AI 门前柜系统设计 一、引言 智能 AI 门前柜系统旨在提供便捷、安全和智能的物品存储与管理解决方案&#xff0c;适用于家庭、公寓或办公场所的入口区域。 二、系统概述 1. 系统目标 - 实现无接触式物品存取&#xff0c;减少交叉感染风险。 - 具备智能识别和分类功能&am…...

ts是什么、tsc是什么、tsx是什么、jsx是什么、scss是什么

一、TS (TypeScript): TypeScript 是一种由微软开发的开源编程语言&#xff0c;它是 JavaScript 的一个超集&#xff0c;增加了类型系统和对ES6及以后版本新特性的支持。TypeScript 旨在解决 JavaScript 开发中的可维护性、可扩展性和大型项目中的复杂性问题。它允许开发者在编…...

【虚拟机】VMware 16图文安装和配置 AlmaLinux OS 9.5 教程

准备工作 下载AlmaLinux ISO文件&#xff1a;从AlmaLinux官方网站&#xff08;https://almalinux.org/&#xff09;下载最新版本的ISO文件。 安装VMware Workstation&#xff1a;确保您的计算机上已安装VMware Workstation。&#xff08;注&#xff1a;我这边使用的是VMware16…...

使用MySQL SLES存储库安装MYSQL

MySQL SLES存储库提供RPM包&#xff0c;用于在SUSE EnterpriseLinuxServer上安装和管理MySQL服务器、客户端和其他组件。 添加MySQLSLES存储库 为系统的存储库列表添加或更新官方MySQLSLES存储库&#xff1a; 配置文件名的开头部分&#xff0c;如mysql84&#xff0c;描述了为…...

30分钟学会HTML

HTML 基本语法 HTML&#xff08;HyperText Markup Language&#xff09;是构成网页内容的基础。它使用一系列的标签来描述网页的结构&#xff0c;包括文本、图片、链接等元素。浏览器会解析这些标签并渲染成我们看到的网页。 在线体验一下 CodePen (在线 HTML 编辑器)。 千万不…...

vue——滑块验证

1. 介绍 1.1 简介 基于滑动式的验证码&#xff0c;免于字母验证码的繁琐输入 用于网页注册或者登录 1.2 来源说明 vue使用滑块验证功能&#xff0c;是基于vue-monoplasty-slide-verify这样的一个开源项目&#xff0c;进行实现的&#xff0c;这是这个开源项目的网址传送阵&#…...

编程入门(2)-2024年 RAD Studio version 12发布综述

随着2024年即将画上句号&#xff0c;我想借此机会回顾一下我们在这一年中发布的一些Embarcadero产品、行业趋势&#xff0c;并感谢我们尊贵的客户们对我们的产品一如既往的支持。这一年对我们来说充满了激动人心的变化和发展&#xff0c;我们非常高兴能与您一起踏上这段旅程。 …...

2025年1月4日蜻蜓q旗舰版st完整开源·包含前后端所有源文件·开源可商用可二开·优雅草科技·优雅草kir|优雅草星星|优雅草银满|优雅草undefined

2025年1月4日蜻蜓q旗舰版st完整开源包含前后端所有源文件开源可商用可二开优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined 产品介绍&#xff1a; 本产品主要贡献者优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined-青史留名&#xff0c;时光如川浪淘…...

米哈游可切换角色背景动态壁纸

米哈游可切换角色背景动态壁纸 0. 视频 B站演示: 米哈游可切换角色背景动态壁纸-wallpaper 1. 基本信息 作者: 啊是特嗷桃系列: 复刻系列 (衍生 wallpaper壁纸引擎 用)网站: 网页版在线预览 (没有搞大小适配, 建议横屏看; 这个不能切角色, 只能在wallpaper中切)仓库: GitHub…...

框架Tensorflow2

深度学习框架之Tensorflow2 Tensorflow2版本的介绍 Tensorflow(简称tf)是深度学习框架&#xff0c;大大简化了建模的方法和步骤&#xff0c;把Keras Api当作核心&#xff0c;使用非常简单&#xff0c;跨平台&#xff0c;集成各种现成模型&#xff0c;eager mode使得调试起来不…...

急需升级,D-Link 路由器漏洞被僵尸网络广泛用于 DDoS 攻击

僵尸网络活动增加 &#xff1a;新的“FICORA”和“CAPSAICIN”僵尸网络&#xff08;Mirai 和 Kaiten 的变体&#xff09;的活动激增。 被利用的漏洞 &#xff1a;攻击者利用已知的 D-Link 路由器漏洞&#xff08;例如 CVE-2015-2051、CVE-2024-33112&#xff09;来执行恶意命…...

银行大数据平台管理系统的设计与实现

标题:银行大数据平台管理系统的设计与实现 内容:1.摘要 摘要&#xff1a;本文介绍了银行大数据平台管理系统的设计与实现。该系统旨在解决银行数据管理中的数据量大、数据类型多、数据处理复杂等问题。通过采用大数据技术&#xff0c;如 Hadoop、Spark 等&#xff0c;实现了数…...

leetcode 732. 我的日程安排表 III

题目&#xff1a;732. 我的日程安排表 III - 力扣&#xff08;LeetCode&#xff09; 这个数据规模&#xff0c;暴力就够了 struct Book {int begin;int end;Book(int b, int e) {begin b;end e;} }; class MyCalendarThree { public:MyCalendarThree() {}int book(int star…...

公共数据授权运营系统建设手册(附下载)

在全球范围内&#xff0c;许多国家和地区已经开始探索公共数据授权运营的路径和模式。通过建立公共数据平台&#xff0c;推动数据的开放共享&#xff0c;促进数据的创新应用&#xff0c;不仅能够提高政府决策的科学性和公共服务的效率&#xff0c;还能够激发市场活力&#xff0…...

现代光学基础6

总结自老师的ppt yt6 半导体激光器开卷考试学习资料 目录 半导体激光器边发射半导体激光器垂直腔面发射激光器&#xff08;VCSEL&#xff09;激光产生条件&#xff08;激光原理&#xff09;半导体激光器的水容器模型有源半导体区域类型和载流子注入发光二极管&#xff08;L…...

利用ChatGPT API构建智能应用的最佳实践

随着自然语言处理&#xff08;NLP&#xff09;技术的飞速发展&#xff0c;基于大型语言模型&#xff08;LLM&#xff09;的应用程序逐渐成为开发者的关注焦点。OpenAI 提供的 ChatGPT API 是当前流行的一项服务&#xff0c;开发者可以利用它来构建多种智能化应用&#xff0c;如…...

源代码编译安装X11及相关库、vim,配置vim(1)

一、目录结构 如下。 所有X11及相关库装到mybuild&#xff0c;源代码下载到src下&#xff0c;解压&#xff0c;进入&#xff0c;编译安装。编译时指定--prefix到相同的目录&#xff0c;即上图中mybuild。 ./configure --prefixpwd/../../mybuild [CFLAGS"-I/path/to/X11…...

Java.函数-acwing

题目一&#xff1a; n的阶乘 804. n的阶乘 - AcWing题库 代码 import java.util.Scanner;public class Main {private static int fact(int n) {int res 1;for(int i 1; i < n; i ) res * i;return res;}public static void main(String[] args) {Scanner sc new Scann…...

文档 | Rstudio下的轻量级单页面markdown阅读器 markdownReader

需求&#xff1a;在写R数据分析项目的时候&#xff0c;代码及结果的关键变化怎么记录下来&#xff1f;最好git能很容易的跟踪版本变化。 markdown 是最理想的选择&#xff0c;本文给出一种Rstuidio下的轻量级md阅读器实现&#xff1a;markdownReader。书写md还是在Rstudio。更…...