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

javaEE初阶————多线程初阶(1)

多线程初阶————

1,认识线程

1.1 概念

1)线程是什么

线程就是一个“执行流”,可以理解为程序执行的最小单位;

可以看成轻量级的进程;

2)为啥要有线程

“并发编程” 的需要,但是我们不是已经有进程了吗,我们要知道,我们进行的是服务器开发,我们在访问网站的时候,一个用户进行访问就是一个进程,用户的数据量是非常庞大的,进程的创建和销毁需要的开销就会变得非常非常大,这样我们就引出了线程,让一个进程中包含一个或多个进程,提升效率,

3)线程和进程的区别

1,进程是操作系统进行资源分配的基本单位,线程是操作系统进行运算调度的基本单位;

2,线程的创建,销毁,调度需要的开销更小;

3,进程之间互不影响,同一进程下的线程会互相影响,创建进程后会自动创建一个线程,第一个线程会涉及到申请资源的操作,其余线程不会涉及,进程销毁才会释放资源,线程的销毁不会释放资源;

4,因为线程是调度相关,所以每一份线程都有调度相关的数据

5,一个进程死掉了不会影响其他进程,但是一个进程中一个线程死掉了就掀桌了,全部都运行不了了;

4)java中线程和操作系统的关系

java中包装好了操作系统中对线程操作的API,但是java是不推荐多进程编程的,我们只去学习多线程编程;

1.2 第一个多线程程序

class MyThread extends Thread{public void run(){System.out.println("myThread");}
}
public class Demo1 {public static void main(String[] args) {Thread thread = new MyThread();thread.start();System.out.println("main");}
}

 main就是进程刚创建我们自动生成的第一个线程,运行

只是个示范,看接下来的讲解就好;

1.3 创建线程

1)创建对象继承Thread类
class MyThread2 extends Thread{public void run(){while(true){System.out.println("MyThread2 线程");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Demo2 {public static void main(String[] args) {Thread thread = new MyThread2();System.out.println("主线程");}
}

我们创建一个类,让它继承Thread类,Thread类中给我们提供了一个run方法,让我们自己去写里面的内容,我们就在自己实现的类中重写run方法,我们循环打印,并且打印一次睡眠1秒,在主线程也就是main方法中,打印主线程,我们来看运行结果;

 

只有一个主线程,因为我们没有去调度线程,我们可以直接用.run或者是.start来开启线程

thread.run();

程序一直在运行,这里不明显,我们来借助一个工具,

找到jdk中的bin ,

以管理员身份运行它

找到我们刚才创建的Demo2

点击线程

我们看到main线程一直在等待,因为我们使用的run方法,所以是在主线程上运行的,如果我们想看到我们自己创建的线程,就要用start

我们在试试;

这个Thread——0就是我们自己创建的线程,但是main呢,还有为啥先打印的主线程呢,因为调度随机的,我们不知道操作系统让拿个线程先执行,所以就会发生这样的状况,这也是我们后期要重点掌握的,要怎么保证线程之间协调配合,避免乌鸦哥掀桌,哈哈哈,main线程在这里已经结束了,没啥好说的了,下一个; 

2)实现Runnable接口
class MyRunnable implements Runnable{public void run(){while(true){System.out.println("MyRunnable 线程");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}public class Demo3 {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();System.out.println("主线程");}
}

这是第二种,我们Runnable接口,我们还是要使用Thread类来创建,这不有病吗.........这么麻烦,还不如用第一种,其实这种想法是不对的,大家听,没听过,高内聚低耦合,这里就谈到了低耦合,我们使用接口,在想要修改的时候去修改接口的代码即可,是不影响Thread的,但是我们使用Thread的时候,想要修改的时候,就要修改Thread中的代码, 可能扯到线程相关的代码,而且用类继承一次局限性大,接口更灵活;

运行

我们这次让主线程也活着


class MyRunnable implements Runnable{public void run(){while(true){System.out.println("MyRunnable 线程");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}public class Demo3 {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(new MyRunnable());thread.start();while(true){System.out.println("主线程");Thread.sleep(1000);}}
}

 来运行

这次更能看到随机调度的现象

3)匿名内部类(Thread)

这几个其实用的都少,最多用到的还是lambda表达式

public class Demo4 {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(){public void run(){while(true){System.out.println("Thread 线程");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};thread.start();while(true){System.out.println("主线程");Thread.sleep(1000);}}
}

跟之前都一样,就是使用·匿名内部类了;

直接看运行

4)匿名内部类(Runnable)
public class Demo5 {public static void main(String[] args) throws InterruptedException {Thread thread =  new Thread(new Runnable() {@Overridepublic void run() {while(true){System.out.println("Thread 线程");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}});thread.start();while(true){System.out.println("主线程");Thread.sleep(1000);}}
}

一样嗷,匿名内部类创建Ruunable对象,

5)lambda表达式

这个才是我们使用最多的方法,主要是很方便;

lambda表达式:

(参数)->{实现了啥}

public class Demo6 {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{while (true){System.out.println("Thread 线程");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});thread.start();while(true){System.out.println("主线程");Thread.sleep(1000);}}
}

 方便吧,在new Thread的时候直接在括号中使用lambda表达式就行;

大家可能有疑问,不说重写run方法吗,这个{}里面的就是我们已经重写了,这个跟那个第三个匿名内部类的方法其实很像的;

我们来看运行结果;

完美嗷

2,Thread类及常见方法

Thread类是JVM用来管理线程的一个类,我们每创建一个Thread对象就有一个线程与他对应;

2.1 Thread的常见构造方法

方法说明
Thread()创建线程对象
Thread(Runnable target)使用Runnable对象创建线程对象
Thread(String name)创建线程对象并命名
Thread(Runnable target,String name)使用Runnable

 Thread thread1 = new Thread();Thread thread2 = new Thread(new Runnable() {public void run() {}});Thread thread3 = new Thread(()->{while (true){System.out.println("线程3");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}},"线程3");Thread thread4 = new Thread(new Runnable() {public void run() {}},"线程4");

我们用4种构造方法创建了线程,我们来观察一下线程3,我们是否把线程的名字修改了呢;

 

 成功看到线程3了;

2.2 Thread的常见属性

属性获取方法
ID

getId()

名称getName()
状态getState()
优先级getPriority()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrputed()

1) ID 类似进程的pid,线程的唯一标识,不同线程不会重复;

2) 名称 各种调试工具用到;

3) 线程当前所处的情况;

3) 通常来说优先级高的线程会容易调用;

4) 可以想象为饭局中的小程序员,对这次饭局不起决定性作用,JVM会在一个进程的所有非后台线程结束后结束;

我们可以使用SetDaemon()来把当前线程设置为后台线程;

5) run方法是否结束;

6) 终止线程运行;

我们来写一个代码获取所以线程信息;

public class Demo2 {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "还活着");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(Thread.currentThread().getName() + "即将死亡");},"线程1");System.out.println("ID :" + Thread.currentThread().getId() + "     "  + "ID :" + thread.getId());System.out.println("name :" + Thread.currentThread().getName() + "     "  + "name :" + thread.getName());System.out.println("state :" + Thread.currentThread().getState() + "     "  + "state :" + thread.getState());System.out.println("优先级 :" + Thread.currentThread().getPriority() + "     "  + "优先级 :" + thread.getPriority());System.out.println("是否存活 :" + Thread.currentThread().isAlive() + "     "  + "是否存活 :" + thread.isAlive());System.out.println("中断? :" + Thread.currentThread().isInterrupted() + "     "  + "中断? :" + thread.isInterrupted());thread.start();while (thread.isAlive()){System.out.println("ID :" + Thread.currentThread().getId() + "     "  + "ID :" + thread.getId());System.out.println("name :" + Thread.currentThread().getName() + "     "  + "name :" + thread.getName());System.out.println("state :" + Thread.currentThread().getState() + "     "  + "state :" + thread.getState());System.out.println("优先级 :" + Thread.currentThread().getPriority() + "     "  + "优先级 :" + thread.getPriority());System.out.println("是否存活 :" + Thread.currentThread().isAlive() + "     "  + "是否存活 :" + thread.isAlive());System.out.println("中断? :" + Thread.currentThread().isInterrupted() + "     "  + "中断? :" + thread.isInterrupted());System.out.println(Thread.currentThread().getState() + " " + thread.getState());Thread.sleep(1000);}System.out.println("ID :" + Thread.currentThread().getId() + "     "  + "ID :" + thread.getId());System.out.println("name :" + Thread.currentThread().getName() + "     "  + "name :" + thread.getName());System.out.println("state :" + Thread.currentThread().getState() + "     "  + "state :" + thread.getState());System.out.println("优先级 :" + Thread.currentThread().getPriority() + "     "  + "优先级 :" + thread.getPriority());System.out.println("是否存活 :" + Thread.currentThread().isAlive() + "     "  + "是否存活 :" + thread.isAlive());System.out.println("中断? :" + Thread.currentThread().isInterrupted() + "     "  + "中断? :" + thread.isInterrupted());}
}

 运行之后就能看到整个过程了;

2.3 启动一个线程

我们之前用过run方法来启动线程,实际上着并不是真正创建了线程,我们使用start真正在操作系统底层创建了一个线程,只有创建了线程对象再start才是让线程真正独立执行了;

2.4 中断一个线程

线程一旦工作就会等到任务结束才会停下来,但是有时候我们有让线程立即停下的需求,我们有两种办法来中断一个线程,其实叫终止更好,因为不是间断,而是线程就结束了;

我们来模拟一个场景,有两个员工张三,李四,老板让他们去给别人转账,张三正在转给骗子,李四及时阻止;

1,共享标记来中断线程

public class Demo3 {public static boolean a = true;public static void main(String[] args) {Thread thread1 = new Thread(()->{while (a){System.out.println(Thread.currentThread().getName() + "正忙着转账呢");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(Thread.currentThread().getName() + "我嘞个豆,差点转走了");},"张三");Thread thread2 = new Thread(()->{try {Thread.sleep(2000);System.out.println(Thread.currentThread().getName() + "老板来电话了!" + "张三在给骗子转账!");a  = false;} catch (InterruptedException e) {throw new RuntimeException(e);}},"李四");thread1.start();thread2.start();}
}

来看运行结果 

哈哈哈哈哈,好玩吧; 

2,调用interrupt()方法来通知

方法说明
Thread对象.interrupt()中断对象关联的线程,如果线程正在阻塞,以异常方式通知,否则设置标志位
public static boolean interrputed();判读当前线程的标志位是否设置,调用后清除标志位;
public boolean 判读当前线程的标志位是否设置,调用后不清除标志位;

在Java线程的上下文中,中断标志位是Thread对象维护内部的布尔值用于表示该线程是否被请求中断。 

public class Demo3 {public static void main(String[] args) {Thread thread1 = new Thread(()->{//或者用Thread.interrupted();while (!Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName() + "正忙着转账呢");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(Thread.currentThread().getName() + "我嘞个豆,差点转走了");},"张三");Thread thread2 = new Thread(()->{try {Thread.sleep(2000);System.out.println(Thread.currentThread().getName() + "老板来电话了!" + "张三在给骗子转账!");thread1.interrupt();} catch (InterruptedException e) {throw new RuntimeException(e);}},"李四");thread1.start();thread2.start();}
}

这里的原理就一样了,但是代码运行会报一个异常,

这个是因为

thread1.interrupt();

 唤醒了sleep让他直接抛出InterruptedException,被捕获到,抛出RuntimeException异常,所以我们在这里直接break就行;

这样结果就对了;

2.5 等待一个线程

方法说明
public void join()等待线程结束
public void join(long millis)等待线程结束,最多等待millis毫秒
public void join(long millis, int nanos)等待线程结束,精度更高;后面是纳秒;

 

public class Demo1 {public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(()->{while (true){System.out.println(Thread.currentThread().getName() + "线程正在工作");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}},"张三");Thread thread2 = new Thread(()->{while (true){System.out.println(Thread.currentThread().getName() + "线程正在工作");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}},"李四");thread1.start();thread1.join();thread2.start();thread2.join();System.out.println("全部线程打印结束");}
}

我们创建了两个线程和主线程,thread1.join意思为让主线程等待thread1线程执行完再执行 ,此时thread2还没开启,我们来看运行结果

 

 

张三始终在工作我天,因为我们使用的join没有放参数,是无休止的等待;如果我们放参数就不会这样傻傻的等待了, 

public class Demo1 {public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(()->{while (!Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName() + "线程正在工作");try {Thread.sleep(1000);} catch (InterruptedException e) {break;}}},"张三");Thread thread2 = new Thread(()->{while (!Thread.interrupted()){System.out.println(Thread.currentThread().getName() + "线程正在工作");try {Thread.sleep(1000);} catch (InterruptedException e) {break;}}},"李四");thread1.start();thread1.join(2000);thread1.interrupt();thread2.start();thread2.join(2000);thread2.interrupt();System.out.println("全部线程打印结束");}
}
");

修改一下代码。。。。。 

 

我们这回看到第一个join先让thread1插队,thread1运行2毫秒后,主线程启动,设置中断标志位,thread1停止,thread2插队,等待两毫秒后嗝屁,主线程也结束了; 

2.6 获取当前线程的引用

 这个之前我们就使用过了;

方法说明
public static Thread currentThread() 返回当前对象的引用,类似this

没啥好说的嗷,来段代码就好了;

public class Demo2 {public static void main(String[] args) {Thread thread = new Thread(()->{System.out.println(Thread.currentThread().getName());},"线程1");thread.start();System.out.println(Thread.currentThread().getName());}
}

 运行结果

2.7 休眠当前线程

这个也没啥好说的,我们一直在使用

方法说明
public static void sleep (long millis) throws InterputedException 休眠当前线程millis毫秒
public static void sleep (long millis,int nanos) throws InterputedException 更高精度

不演示了嗷,马上下一期

相关文章:

javaEE初阶————多线程初阶(1)

多线程初阶———— 1&#xff0c;认识线程 1.1 概念 1&#xff09;线程是什么 线程就是一个“执行流”&#xff0c;可以理解为程序执行的最小单位&#xff1b; 可以看成轻量级的进程&#xff1b; 2&#xff09;为啥要有线程 “并发编程” 的需要&#xff0c;但是我们不…...

DOM 操作入门:HTML 元素操作与页面事件处理

DOM 操作入门:HTML 元素操作与页面事件处理 DOM 操作入门:HTML 元素操作与页面事件处理什么是 DOM?1. 如何操作 HTML 元素?1.1 使用 `document.getElementById()` 获取单个元素1.2 使用 `document.querySelector()` 和 `document.querySelectorAll()` 获取多个元素1.3 创建…...

排序算法--桶排序

核心思想为分区间排序后合并。适用于数据均匀分布在一个范围内&#xff0c;或浮点数排序或范围明确的数据。如果需要处理整数或其他数据范围&#xff0c;可以通过调整BUCKET_RANGE的计算方式实现&#xff0c;例如对[0,100)的整数排序&#xff1a; int index arr[i] / 10; // …...

Baklib推动数字化内容管理解决方案助力企业数字化转型

内容概要 在当今信息爆炸的时代&#xff0c;数字化内容管理成为企业提升效率和竞争力的关键。企业在面对大量数据时&#xff0c;如何高效地存储、分类与检索信息&#xff0c;直接关系到其经营的成败。数字化内容管理不仅限于简单的文档存储&#xff0c;更是整合了文档、图像、…...

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上&#xff0c;主要对分布式应用架构下的异步化机制和缓存技术进行学习&#xff0c;主要记录和思考如下&#xff0c;供大家学习参考。大家知道原来传统的单一WAR应用中&#xff0c;由于所有数据都在同一个数据库中&#xff0c;因此事务问题一般借助数据库事…...

Hive存储系统全面测试报告

引言 在大数据时代&#xff0c;数据存储和处理技术的重要性日益凸显。Apache Hive作为一个基于Hadoop的数据仓库工具&#xff0c;因其能够提供类SQL查询功能&#xff08;HiveQL&#xff09;而广受欢迎。Hive的设计初衷是为了简化大数据集的查询和管理&#xff0c;它允许用户通…...

【产品经理学习案例——AI翻译棒出海业务】

前言&#xff1a; 本文主要讲述了硬件产品在出海过程中&#xff0c;翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家&#xff0c;需要优化翻译质量和算法&#xff0c;关注市场需求和文化差异&#xff0c;以便更好地满足当地用户的需求。同…...

Golang 并发机制-3:通道(channels)机制详解

并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang&#xff08;也称为 Go&#xff09;通过通道&#xff08;channels&#xff09;这一特性&#xff0c;能够可靠且优雅地实现并发通信。本文将揭示通道的概念&#xff0c;解释其在并发编程中的作用&#xff0c;并提供…...

【LeetCode 刷题】回溯算法(2)-分割问题

此博客为《代码随想录》二叉树章节的学习笔记&#xff0c;主要内容为回溯算法分割问题相关的题目解析。 文章目录 131.分割回文串93.复原IP地址 131.分割回文串 题目链接 class Solution:def partition(self, s: str) -> List[List[str]]:res, path [], []def check(s: …...

前端力扣刷题 | 6:hot100之 矩阵

73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 法一&#xff1a; var setZeroes function(matrix) {let setX new Set(); // 用于存储需要置零的行索引let setY new Set(); //…...

pytorch实现半监督学习

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 半监督学习&#xff08;Semi-Supervised Learning&#xff0c;SSL&#xff09;结合了有监督学习和无监督学习的特点&#xff0c;通常用于部分数据有标签、部分数据无标签的场景。其主要步骤如下&#xff1a; 1. 数…...

X Window System 架构概述

X Window System 架构概述 1. X Server 与 X Client ​ 这里引入一张维基百科的图&#xff0c;在Linux系统中&#xff0c;若用户需要图形化界面&#xff0c;则可以使用X Window System&#xff0c;其使用**Client-Server**架构&#xff0c;并通过网络传输相关信息。 ​ ​ X…...

中国证券基本知识汇总

中国证券市场是一个多层次、多领域的市场&#xff0c;涉及到各种金融工具、交易方式、市场参与者等内容。以下是中国证券基本知识的汇总&#xff1a; 1. 证券市场概述 证券市场&#xff1a;是指买卖证券&#xff08;如股票、债券、基金等&#xff09;的市场。证券市场可以分为…...

虚幻基础17:动画蓝图

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 animation blueprint图表&#xff08;Graph&#xff09;&#xff1a; 编辑动画逻辑。变量&#xff08;Variables&#xff09;&#xff1a; 管理动画参数。函数&#xff08;Functions&#xff09;&#xff1a; 自定义…...

初入机器学习

写在前面 本专栏专门撰写深度学习相关的内容&#xff0c;防止自己遗忘&#xff0c;也为大家提供一些个人的思考 一切仅供参考 概念辨析 深度学习&#xff1a; 本质是建模&#xff0c;将训练得到的模型作为系统的一部分使用侧重于发现样本集中隐含的规律难点是认识并了解模型&…...

中间件的概念及基本使用

什么是中间件 中间件是ASP.NET Core的核心组件&#xff0c;MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲&#xff1a;Tomcat、WebLogic、Redis、IIS&#xff1b;狭义上来讲&#xff0c;ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…...

Docker 部署教程jenkins

Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器&#xff0c;主要用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;过程。它帮助开发人员自动化构建、测试和部署应用程序&#xff0c;显著提高软件开发的效率和质量…...

LeetCode:53.最大子序和

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;53.最大子序和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数…...

C++ 游戏开发:完整指南

目录 什么是游戏开发&#xff1f; 为什么选择 C 进行游戏开发&#xff1f; C 游戏开发&#xff1a;完整指南 1. 理解游戏开发的基础 2. 学习游戏引擎 3. 精通 C 进行游戏开发 4. 学习数学在游戏开发中的应用 5. 探索图形编程 6. 专注于游戏开发的某一领域 7. 通过游戏项目进行实…...

数据结构:时间复杂度

文章目录 为什么需要时间复杂度分析&#xff1f;一、大O表示法&#xff1a;复杂度的语言1.1 什么是大O&#xff1f;1.2 常见复杂度速查表 二、实战分析&#xff1a;解剖C语言代码2.1 循环结构的三重境界单层循环&#xff1a;线性时间双重循环&#xff1a;平方时间动态边界循环&…...

测试工程师的DS使用指南

目录 引言DeepSeek在测试设计中的应用 2.1 智能用例生成2.2 边界值分析2.3 异常场景设计DeepSeek在自动化测试中的应用 3.1 脚本智能转换3.2 日志智能分析3.3 测试数据生成DeepSeek在质量保障体系中的应用 4.1 测试策略优化4.2 缺陷模式预测4.3 技术方案验证DeepSeek在测试效能…...

http3网站的设置(AI不会配,得人工配)

堡塔PHP项目中配置nginx1.26.0设置http3协议 # 文件所在服务器中的路径 /www/server/nginx/conf/nginx.confuser www www; worker_processes auto; error_log /www/wwwlogs/nginx_error.log crit; pid /www/server/nginx/logs/nginx.pid; worker_rlimit_nofile 512…...

搜索引擎快速收录:关键词布局的艺术

本文来自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/21.html 搜索引擎快速收录中的关键词布局&#xff0c;是一项既精细又富有策略性的工作。以下是对关键词布局艺术的详细阐述&#xff1a; 一、关键词布局的重要性 关键词布局影响着后期页面…...

WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果

WPF进阶 | WPF 动画特效揭秘&#xff1a;实现炫酷的界面交互效果 前言一、WPF 动画基础概念1.1 什么是 WPF 动画1.2 动画的基本类型1.3 动画的核心元素 二、线性动画详解2.1 DoubleAnimation 的使用2.2 ColorAnimation 实现颜色渐变 三、关键帧动画深入3.1 DoubleAnimationUsin…...

基于微信小程序的辅助教学系统的设计与实现

标题:基于微信小程序的辅助教学系统的设计与实现 内容:1.摘要 摘要&#xff1a;随着移动互联网的普及和微信小程序的兴起&#xff0c;基于微信小程序的辅助教学系统成为了教育领域的一个新的研究热点。本文旨在设计和实现一个基于微信小程序的辅助教学系统&#xff0c;以提高教…...

给AI加知识库

1、加载 Document Loader文档加载器 在 langchain_community. document_loaders 里有很多种文档加载器 from langchain_community. document_loaders import *** 1、纯文本加载器&#xff1a;TextLoader&#xff0c;纯文本&#xff08;不包含任何粗体、下划线、字号格式&am…...

【LeetCode 刷题】回溯算法(5)-棋盘问题

此博客为《代码随想录》二叉树章节的学习笔记&#xff0c;主要内容为回溯算法棋盘问题相关的题目解析。 文章目录 51. N皇后37. 解数独332.重新安排行程 51. N皇后 题目链接 class Solution:def solveNQueens(self, n: int) -> List[List[str]]:board [[. for _ in rang…...

Vue.js组件开发-实现字母向上浮动

使用Vue实现字母向上浮动的效果 实现步骤 创建Vue项目&#xff1a;使用Vue CLI来创建一个新的Vue项目。定义组件结构&#xff1a;在组件的模板中&#xff0c;定义包含字母的元素。添加样式&#xff1a;使用CSS动画来实现字母向上浮动的效果。绑定动画类&#xff1a;在Vue组件…...

2025蓝桥杯JAVA编程题练习Day2

1.大衣构造字符串 问题描述 已知对于一个由小写字母构成的字符串&#xff0c;每次操作可以选择一个索引&#xff0c;将该索引处的字符用三个相同的字符副本替换。 现有一长度为 NN 的字符串 UU&#xff0c;请帮助大衣构造一个最小长度的字符串 SS&#xff0c;使得经过任意次…...

WPF进阶 | WPF 样式与模板:打造个性化用户界面的利器

WPF进阶 | WPF 样式与模板&#xff1a;打造个性化用户界面的利器 一、前言二、WPF 样式基础2.1 什么是样式2.2 样式的定义2.3 样式的应用 三、WPF 模板基础3.1 什么是模板3.2 控件模板3.3 数据模板 四、样式与模板的高级应用4.1 样式继承4.2 模板绑定4.3 资源字典 五、实际应用…...

趣味Python100例初学者练习01

1. 1 抓交通肇事犯 一辆卡车违反交通规则&#xff0c;撞人后逃跑。现场有三人目击该事件&#xff0c;但都没有记住车号&#xff0c;只记下了车号的一些特征。甲说&#xff1a;牌照的前两位数字是相同的&#xff1b;乙说&#xff1a;牌照的后两位数字是相同的&#xff0c;但与前…...

每日一题——有效括号序列

有效括号序列 题目描述数据范围&#xff1a;复杂度要求&#xff1a; 示例题解代码实现代码解析1. 定义栈和栈操作2. 栈的基本操作3. 主函数 isValid4. 返回值 时间和空间复杂度分析 题目描述 给出一个仅包含字符 (, ), {, }, [, ] 的字符串&#xff0c;判断该字符串是否是一个…...

MQTT 术语表

Broker 有时我们也会直接将服务端称为 Broker&#xff0c;这两个术语可以互换使用。 Clean Start 客户端可以在连接时使用这个字段来指示是期望从已存在的会话中恢复通信&#xff0c;还是创建一个全新的会话。仅限 MQTT v5.0。 Client 使用 MQTT 协议连接到服务端的设备或…...

每天学点小知识之设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解模板方法模式 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基…...

ubuntuCUDA安装

系列文章目录 移动硬盘制作Ubuntu系统盘 前言 根据前篇“移动硬盘制作Ubuntu系统盘”安装系统后&#xff0c;还不能够使用显卡。 如果需要使用显卡&#xff0c;还需要进行相关驱动的安装&#xff08;如使用的为Nvidia显卡&#xff0c;就需要安装相关的Nvidia显卡驱动&#xff…...

信息学奥赛一本通 2113:【24CSPJ普及组】小木棍(sticks) | 洛谷 P11229 [CSP-J 2024] 小木棍

【题目链接】 ybt 2113&#xff1a;【24CSPJ普及组】小木棍&#xff08;sticks&#xff09; 洛谷 P11229 [CSP-J 2024] 小木棍 【题目考点】 1. 思维题&#xff0c;找规律 【解题思路】 解法1&#xff1a;找规律 该题为&#xff1a;求n根木棍组成的无前导0的所有可能的数…...

【数据结构】(5) ArrayList 顺序表

一、使用 ArrayList ArrayList 就是数组的封装&#xff0c;但是数组只有 [] 操作存取值&#xff0c;和 .length 操作获取数组内存长度&#xff1b;而 ArrayList 有更多的功能&#xff1a; 1、创建对象 2、扩容机制 ArrayList 有自动扩容机制&#xff0c;在插入元素时不用担心数…...

Elasticsearch 指南 [8.17] | Search APIs

Search API 返回与请求中定义的查询匹配的搜索结果。 http GET /my-index-000001/_search Request GET /<target>/_search GET /_search POST /<target>/_search POST /_search Prerequisites 如果启用了 Elasticsearch 安全功能&#xff0c;针对目标数据流…...

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具03

SQLSERVER的ImpDp和ExpDp工具 1、全部的表导出&#xff08;仅表结构导出&#xff09; 2、导出的表结构&#xff0c;导入到新的数据库 导入前&#xff0c;test3数据没有任何表 导入 导入结果确认&#xff1a;表都被做成&#xff0c;但是没有数据 3、全部的表导出&#x…...

JVM-运行时数据区

JVM的组成 运行时数据区-总览 Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。 《Java虚拟机规范》中规定了每一部分的作用 运行时数据区-应用场景 Java的内存分成哪几部分&#xff1f; Java内存中哪些部分会内存溢出&#xff1f; JDK7 和J…...

经典本地影音播放器MPC-BE.

经典本地影音播放器MPC-BE 链接&#xff1a;https://pan.xunlei.com/s/VOIAZbbIuBM1haFdMYCubsU-A1?pwd4iz3# MPC-BE&#xff08;Media Player Classic Black Edition&#xff09;是来自 MPC-HC&#xff08;Media Player Classic Home Cinema&#xff09;的俄罗斯开发者重新…...

求水仙花数,提取算好,打表法。或者暴力解出来。

暴力解法 #include<bits/stdc.h> using namespace std; int main() {int n,m;cin>>n>>m;if(n<3||n>7||m<0){cout<<"-1";return 0;}int powN[10];//记录0-9的n次方for(int i0;i<10;i){powN[i](int)pow(i,n);}int low(int) pow(1…...

后盾人JS -- 原型

没有原型的对象 也有没有原型的对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...

Deepseek-R1 和 OpenAI o1 这样的推理模型普遍存在“思考不足”的问题

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Nginx 命令行参数

文章来源&#xff1a;命令行参数 -- nginx中文文档|nginx中文教程 nginx 支持以下命令行参数&#xff1a; -?| — 打印帮助 以获取命令行参数。-h-c file— 使用替代项 configuration 而不是 default 文件。file-e file— 使用替代项 error log 来存储日志 而不是默认文件 &…...

YOLOV11-1:YoloV11-安装和CLI方式训练模型

YoloV11-安装和CLI方式训练模型 1.安装和运行1.1安装的基础环境1.2安装yolo相关组件1.3命令行方式使用1.3.1 训练1.3.2 预测 本文介绍yoloV11的安装和命令行接口 1.安装和运行 1.1安装的基础环境 GPU环境&#xff0c;其中CUDA是12.4版本 1.2安装yolo相关组件 # 克隆github…...

Docker Hub 镜像 Pull 失败的解决方案

目录 引言一、问题二、原因三、解决方法四、参考文献 引言 在云原生技术火热的当下&#xff0c;Docker可谓是其基础&#xff0c;由于其简单以及方便性&#xff0c;让开发人员不必再为环境配置问题而伤脑筋&#xff0c;因为可将其看作一个虚拟机程序去理解。所以掌握好它可谓是…...

重新思考绩效管理变革

Peter Cappelli 和 Anna Tavis 在绩效管理变革一文中&#xff0c;为我们带来了很多关于绩效管理变革的思考。企业为什么做绩效管理变革&#xff0c;为什么现在需要&#xff1f;让我们看看这些学者是如何思考的。 摘要 受到老板和下属的痛恨&#xff0c;传统的绩效考核已经被超…...

内核定时器2-高分辨率定时器

高分辨率定时器与低分辨率定时器 高分辨率定时器与低分辨率定时器相比&#xff0c;有如下两个根本性的不同。 (1) 高分辨率定时器使用红黑树对定时器进行管理。 (2) 定时器独立于周期时钟。即不基于jiffies&#xff0c;精度可以达到纳秒级别。 内核2.6.16版本开始&#xff…...

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具02

工具运行前的环境准备 1、登录用户管理员权限确认 工具使用的登录用户(-u后面的用户)&#xff0c;必须具有管理员的权限&#xff0c;因为需要读取系统表 例&#xff1a;Export.bat -s 10.48.111.12 -d db1 -u test -p test -schema dbo      2、Powershell的安全策略确认…...