JAVA多线程学习
文章目录
- 线程相关概念
- 线程创建
- 继承Thread类
- Runnable接口
- 多个线程同时操作同一个对象测试:
- 实现callable接口(了解)
- 静态代理
- lamda表达式
- 线程状态
- 线程停止
- 线程休眠
- 线程礼让
线程相关概念
-
线程:是进程的一部分,一个进程之内的线程之间共享进程的地址空间、资源。
-
进程:一个进程可以包含干个线程,但至少有一个线程(线程是CPU调度和执行的单位)。每个进程有独立的地址空间、全局变量、系统资源。是系统资源分配的单位。
-
多线程:一个进程中并发多个线程,每个线程执行不同任务。
很多多线程是模拟出来的。真正的多线程是指有多个CPU(即多核,多服务)。如果是模拟出来的线程,即在一个cpu的情况下,在同一时间点,cpu只能执行一个代码,因为切换的很快,造成同时执行的错觉。
相关概念线程就是独立执行的路径;
程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;
main()为主线程,为系统的入口,用于执行整个程序;
在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度;
对于同一份资源操作时,会存在资源抢夺问题,需加入并发控制;
线程会带来额外开销,如cpu调度时间,并发控制开销;
每个线程在自己的工作内存交互,内存控制不当会造成数据不一致;
线程创建
三种创建方式:
- Thread class(继承Thread类)
- Runnable接口(实现Runnable接口)
- Callable接口(实现Callable接口,了解即可)
继承Thread类
自定义线程类继承Thread类
重写run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
package ThreadStudy;
//继承Thread类
public class ThreadTest01 extends Thread{@Overridepublic void run(){//run()方法线程体for(int i=0;i<10;i++){System.out.println("run"+i);}}public static void main(String[] args) {//main线程(主线程)//创建一个线程对象ThreadTest01 threadTest01 =new ThreadTest01();//调用start()方法开启线程threadTest01.start();for(int i=0;i<10;i++){System.out.println("主线程"+i);}}
}
总结:线程开启不一定立即执行,这个由CPU进行调度。
案例:下载图片
package ThreadStudy;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.security.spec.RSAOtherPrimeInfo;
//实现多线程同步下载图片
public class DownloadTest extends Thread{private String url;//图片地址private String name;//保存的文件名public DownloadTest(String url,String name){this.name=name;this.url=url;}@Overridepublic void run(){webDownloader webDownloader=new webDownloader();webDownloader.downloader(url,name);System.out.println("下载了文件名为:"+name);}public static void main(String[] args) {DownloadTest t1=new DownloadTest("https://img30.360buyimg.com/security/jfs/t1/106812/11/17157/47913/5e859436E81f1efd9/c6c4cf56305d75d2.jpg","1.jpg");DownloadTest t2=new DownloadTest("https://img30.360buyimg.com/security/jfs/t1/100763/10/17328/48613/5e85946eEd153e514/8ffec9a8e7832567.jpg","2.jpg");DownloadTest t3=new DownloadTest("https://img30.360buyimg.com/security/jfs/t1/98816/36/17526/48339/5e8594a8E4e154c27/42afb9370b45dab5.jpg","3jpg");t1.start();t2.start();t3.start();}
}//下载器
class webDownloader{//下载方法public void downloader(String url,String name) {try {FileUtils.copyURLToFile(new URL(url), new File(name));} catch (IOException e) {e.printStackTrace();System.out.println("IO异常,downloader方法出现问题");}}
}
可以看到下载不是按照顺序下载的
Runnable接口
定义MyRunnable类实现Rnnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
package ThreadStudy;public class TestRunnable implements Runnable{@Overridepublic void run(){for(int i=0;i<10;i++){System.out.println("run"+i);}}public static void main(String[] args) {//创建runnable接口的实现类对象TestRunnable testRunnable=new TestRunnable();//创建线程对象,通过线程对象开启线程,代理//相当于://Thread thread=new thread(testRunnable);\//thread.start();new Thread(testRunnable).start();for(int i=0;i<20;i++){System.out.println("main"+i);}}
}
使用Runnable接口实现下载图片:
只需要将继承Thread改为实现Runnable接口,再改一下start()部分即可
package ThreadStudy;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.security.spec.RSAOtherPrimeInfo;
//实现多线程同步下载图片
public class DownloadTest implements Runnable{private String url;//图片地址private String name;//保存的文件名public DownloadTest(String url,String name){this.name=name;this.url=url;}@Overridepublic void run(){webDownloader webDownloader=new webDownloader();webDownloader.downloader(url,name);System.out.println("下载了文件名为:"+name);}public static void main(String[] args) {DownloadTest t1=new DownloadTest("https://img30.360buyimg.com/security/jfs/t1/106812/11/17157/47913/5e859436E81f1efd9/c6c4cf56305d75d2.jpg","1.jpg");DownloadTest t2=new DownloadTest("https://img30.360buyimg.com/security/jfs/t1/100763/10/17328/48613/5e85946eEd153e514/8ffec9a8e7832567.jpg","2.jpg");DownloadTest t3=new DownloadTest("https://img30.360buyimg.com/security/jfs/t1/98816/36/17526/48339/5e8594a8E4e154c27/42afb9370b45dab5.jpg","3jpg");new Thread(t1).start();new Thread(t2).start();new Thread(t3).start();}
}//下载器
class webDownloader{//下载方法public void downloader(String url,String name) {try {FileUtils.copyURLToFile(new URL(url), new File(name));} catch (IOException e) {e.printStackTrace();System.out.println("IO异常,downloader方法出现问题");}}
}
小结:
继承Thread类
- 子类继承Thread类,具备多线程能力
- 启动线程:子类对象.start()
- 不建议使用:避免OOP单继承局限性
实现Runnable接口
- 实现接口Runnable具有多线程能力
- 启动线程:传入目标对象+Thread(对象).start()
- 推荐使用:避免单继承局限性,灵活,方便同一个对象被多个线程使用
多个线程同时操作同一个对象测试:
package ThreadStudy;
//多个线程同时操作同一个对象
//模拟买票的例子
//发现问题:多个线程操作同一个资源时,线程不安全,数据紊乱
public class ThreadTest01 implements Runnable{private int ticketNums=10;@Overridepublic void run(){while(true){if(ticketNums<1){break;}//模拟延时try{Thread.sleep(200);}catch(Exception e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"张票");}}public static void main(String[] args) {//创建runnable接口的实现类对象ThreadTest01 ticket=new ThreadTest01();//创建线程对象,通过线程对象开启线程new Thread(ticket,"A").start();new Thread(ticket,"B").start();new Thread(ticket,"C").start();}
}
案例:龟兔赛跑
package ThreadStudy;
//模拟龟兔赛跑
public class Race implements Runnable{private static String winner;@Overridepublic void run(){for(int i=0;i<=100;i++){//模拟兔子休息if(Thread.currentThread().getName().equals("rabbit")&&i%10==0){try{Thread.sleep(1);}catch(Exception e){e.printStackTrace();}}//判断比赛是否结束boolean flag=gameOver(i);if(flag){break;}System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");}}//判断是否完成比赛private boolean gameOver(int steps){if(winner!=null){return true;}{if(steps>=100){winner=Thread.currentThread().getName();System.out.println("winner is "+winner);return true;}}return false;}public static void main(String[] args) {Race race=new Race();new Thread(race,"rabbit").start();new Thread(race,"turtle").start();}
}
实现callable接口(了解)
实现callable接口需要返回值类型
重写call方法,需要抛出异常
创建目标对象
创建执行服务:ExecutorService ser=Executors.newFixedThreadPool(1);
提交执行:Future result1=ser.submit(t1);
获取结果:boolean r1=result1.get()
关闭服务:ser.shutdownNow();
package ThreadStudy;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.concurrent.*;//实现多线程同步下载图片
public class TestCallable implements Callable<Boolean> {private String url;//图片地址private String name;//保存的文件名public TestCallable(String url,String name){this.name=name;this.url=url;}@Overridepublic Boolean call(){webDownloader webDownloader=new webDownloader();webDownloader.downloader(url,name);System.out.println("下载了文件名为:"+name);return true;}public static void main(String[] args) throws ExecutionException, InterruptedException {TestCallable t1=new TestCallable("https://img30.360buyimg.com/security/jfs/t1/106812/11/17157/47913/5e859436E81f1efd9/c6c4cf56305d75d2.jpg","1.jpg");TestCallable t2=new TestCallable("https://img30.360buyimg.com/security/jfs/t1/100763/10/17328/48613/5e85946eEd153e514/8ffec9a8e7832567.jpg","2.jpg");TestCallable t3=new TestCallable("https://img30.360buyimg.com/security/jfs/t1/98816/36/17526/48339/5e8594a8E4e154c27/42afb9370b45dab5.jpg","3jpg");//创建执行服务ExecutorService ser= Executors.newFixedThreadPool(3);//提交执行Future<Boolean> r1=ser.submit(t1);Future<Boolean> r2=ser.submit(t2);Future<Boolean> r3=ser.submit(t3);//获取结果boolean rs1=r1.get();boolean rs2=r2.get();boolean rs3=r3.get();//关闭服务ser.shutdownNow();}
}//下载器
class webDownloader{//下载方法public void downloader(String url,String name) {try {FileUtils.copyURLToFile(new URL(url), new File(name));} catch (IOException e) {e.printStackTrace();System.out.println("IO异常,downloader方法出现问题");}}
}
静态代理
package ThreadStudy;//静态代理模式
public class StaticProxy {public static void main(String[] args) {WeddingCompany weddingcompany=new WeddingCompany(new You());weddingcompany.HappyMarry();}
}interface Marry{void HappyMarry();
}class You implements Marry{@Overridepublic void HappyMarry(){System.out.println("happy");}
}class WeddingCompany implements Marry{private Marry target;public WeddingCompany(Marry target){this.target=target;}@Overridepublic void HappyMarry(){before();this.target.HappyMarry();after();}private void before(){System.out.println("结婚之前,布置现场");}private void after(){System.out.println("结婚之后,收尾款");}
}
静态代理总结:
真实对象和代理对象都要实现同一个目标,代理对象要代理真实角色
代理对象可以实现真实对象实现不了的功能,真实对象专注自己的功能
lamda表达式
为了避免匿名内部类定义过多,可以使代码看起来更简洁,其实质属于函数式编程。
**函数式接口定义:**只包含唯一一个抽象方法,那么它就是函数式接口。
public interface Runnable{public abstract vvoid run();
}
对于函数式接口,可以通过lamda表达式创建该接口的对象。
格式:
(params) -> expresssion[表达式](params)->statement[语句](params)->{statements}
package lamda;/*
推导lamda表达式
*/
public class TestLamda {//2、静态内部类static class Like2 implements ILike{@Overridepublic void lamda(){System.out.println("test lamda2");}}public static void main(String[] args) {ILike like =new Like1();like.lamda();like =new Like2();like.lamda();//3、局部内部类class Like3 implements ILike{@Overridepublic void lamda(){System.out.println("test lamda3");}}like=new Like3();like.lamda();//4、匿名内部类,没有类的名称,必须借助接口或父类like=new ILike(){@Overridepublic void lamda(){System.out.println("test lamda4");}};like.lamda();//5、lamda简化like=()->{System.out.println("test lamda5");};like.lamda();}
}//0、定义一个函数式接口
interface ILike{void lamda();
}//1、实现类
class Like1 implements ILike{@Overridepublic void lamda(){System.out.println("test lamda1");}
}
线程状态
线程方法
方法 | 说明 |
---|---|
setPriority(int new Priority) | 更改线程优先级 |
static void sleep(long millis) | 在指定的毫秒数内让当前正在执行的线程休眠 |
void join() | 等待该线程终止 |
static void yield() | 暂停当前正在执行的线程对象,并执行其他线程 |
void interrupt() | 中断线程(尽量别用这个方式) |
boolean isAlive() | 测试线程是否处于活动状态 |
线程停止
尽量使线程自动停止(通过设置标记位)
线程休眠
线程礼让
线程强制执行
观测线程状态
线程优先级
相关文章:
JAVA多线程学习
文章目录 线程相关概念线程创建继承Thread类Runnable接口多个线程同时操作同一个对象测试:实现callable接口(了解)静态代理lamda表达式 线程状态线程停止线程休眠线程礼让 线程相关概念 线程:是进程的一部分,一个进程之内的线程之间共享进程的…...
【c语言】指针 (完结)
一、sizeof和strlen的对比 1、sizeof 前面我们在学习操作符的时候,我们学习了sizeof,知道其是计算变量所占内存的大小的,单 位是字节,如果操作数是数据类型的话,计算的就是这个类型的变量所占的内存空间的大…...
vue使用自动化导入api插件unplugin-auto-import,避免频繁手动导入
unplugin-auto-import是一个现代的自动导入插件,旨在简化前端开发中的导入过程,减少手动导入的繁琐工作,提升开发效率。它支持多种构建工具,包括Vite、Webpack、Rollup和esbuild,并且可以与TypeScript配合使用&…...
matlab函数讲解——randsample
在MATLAB中,randsample函数用于从一个给定的集合中随机选择样本。函数的基本用法是从指定范围内随机选择元素,具体用法如下: 用法 y randsample(n, k, true, w)参数说明 n: 整数,表示从1到n的集合中进行抽样。例如,…...
50_Lua垃圾回收
1.Lua垃圾回收机制概述 Lua采用了一种自动内存管理机制,称为垃圾回收(Garbage Collection, GC)。垃圾回收的主要目的是回收程序中不再被使用的内存,从而避免内存泄漏。Lua的垃圾回收器负责回收动态分配的对象,如函数、用户数据、表、字符串、线程、内部结构等。Lua的垃圾…...
【Python】数据容器:列表,元组,字符串,集合字典及通用操作
文章目录 一.序列1.1list列表定义常用操作列表的遍历 1.2tuple元组定义常见操作元组的遍历 1.3str字符串定义常见操作字符串的遍历 1.4序列常用操作——切片 二.set集合定义常见操作集合的遍历 三.dict字典定义常用操作字典的嵌套 *数据容器对比总结四.数据容器的通用操作4.1通…...
Wi-Fi Direct (P2P)原理及功能介绍
目录 Wi-Fi Direct (P2P)介绍Wi-Fi Direct P2P 概述P2P-GO(P2P Group Owner)工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct ÿ…...
系统看门狗配置--以ubuntu为例
linux系统配置看门狗 以 ubuntu 系统配置看门狗为例 配置看门狗使用的脚本文件,需要使用管理员权限来执行: 配置是:系统每 30S 喂一次狗,超过 60S 不进行投喂,就会自动重启。 1. 系统脚本内容: #!/bin/b…...
Mysql--基础篇--多表查询(JOIN,笛卡尔积)
在MySQL中,多表查询(也称为联表查询或JOIN操作)是数据库操作中非常常见的需求。通过多表查询,你可以从多个表中获取相关数据,并根据一定的条件将它们组合在一起。MySQL支持多种类型的JOIN操作,每种JOIN都有…...
44_Lua迭代器
在Lua中,迭代器是一种用于遍历集合元素的重要工具。掌握迭代器的使用方法,对于提高Lua编程的效率和代码的可读性具有重要意义。 1.迭代器概述 1.1 迭代器介绍 迭代器是一种设计模式,它提供了一种访问集合元素的方法,而不需要暴露其底层结构。在Lua中,迭代器通常以一个函…...
网络原理(三)—— 传输层 之 UDP 和 TCP协议
传输层 在传输层两大关键的协议就是UDP和TCP协议了,除此之外,还有别的传输层协议,本文章将介绍UDP和TCP协议,重点介绍TCP协议。 首先回顾TCP和UDP 的特点: UDP:不可靠传输,面向数据包…...
Swin Transformer模型详解(附pytorch实现)
写在前面 Swin Transformer(Shifted Window Transformer)是一种新颖的视觉Transformer模型,在2021年由微软亚洲研究院提出。这一模型提出了一种基于局部窗口的自注意力机制,显著改善了Vision Transformer(ViT…...
opencv进行人脸识别环境搭建
1. 构建人脸识别环境 1) 下载安装opencv 下载地址:Releases - OpenCV 参考博文:OpenCV下载安装教程(Windows)-CSDN博客 下载对应系统的opencv,如windows版,opencv-4.5.5-vc14_vc15.exe 2) 然后解压缩到…...
java小灶课详解:关于char和string的区别和对应的详细操作
char和string的区别与操作详解 在编程语言中,char和string是用于处理字符和字符串的两种重要数据类型。它们在存储、操作和应用场景上存在显著差异。本文将从以下几个方面详细解析两者的区别及常见操作。 1. 基本定义与存储差异 char: 定义:…...
计算机网络之---RIP协议
RIP协议的作用 RIP (Routing Information Protocol) 协议是一个基于距离矢量的路由协议,它在网络中用来动态地交换路由信息。RIP 是最早的路由协议之一,通常用于小型和中型网络中。它的工作原理简单,易于实现,但在一些大型网络中效…...
F#语言的文件操作
F#语言的文件操作 F#是一种功能性编程语言,运行在.NET平台上,特别适合处理并发和复杂的数据处理任务。在这篇文章中,我们将介绍F#语言中的文件操作,包括读取、写入和管理文件的基本方法。通过实例来帮助理解,适合初学…...
微信小程序开发设置支持scss文件
在微信小程序开发中,默认是不支持scss文件的,创建文件的时候,css文件默认创建的是wxss后缀结尾的,但是用习惯了scss的怎么办呢? 首先找到project.config.json文件,打开文件在setting下设置useCompilerPlug…...
【Excel笔记_3】execl的单元格是#DIV/0!,判断如果是这个,则该单元格等于空
在 Excel 中,可以使用 IF 函数来判断单元格是否是 #DIV/0! 错误,并将其替换为空值(即空字符串 "")。具体公式如下: IF(ISERROR(A1), "", A1)或者,如果只想判断 #DIV/0! 错误ÿ…...
51单片机入门基础
目录 一、基础知识储备 (一)了解51单片机的基本概念 (二)掌握数字电路基础 (三)学习C语言编程基础 二、开发环境搭建 (一)硬件准备 (二)软件准备 三、…...
设计模式 行为型 访问者模式(Visitor Pattern)与 常见技术框架应用 解析
访问者模式(Visitor Pattern)是一种行为设计模式,它允许你在不改变元素类的前提下定义作用于这些元素的新操作。这种模式将算法与对象结构分离,使得可以独立地变化那些保存在复杂对象结构中的元素的操作。 假设我们有一个复杂的对…...
stable diffusion 量化学习笔记
文章目录 一、一些tensorRT背景及使用介绍1)深度学习介绍2)TensorRT优化策略介绍3)TensorRT基础使用流程4)dynamic shape 模式5)TensorRT模型转换 二、TensorRT转onnx模型1)onnx介绍2)背景知识&…...
金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成
目录 一、⾃动化测试理论 二、自动化脚本 1、添加断言 1️⃣注册、登录 2️⃣认证、充值、开户、投资 2、可重复执行:清除测试数据脚本按指定顺序执行 1️⃣如何可以做到可重复执⾏? 2️⃣清除测试数据:连接数据库setup线程组 ①明确…...
无需昂贵GPU:本地部署开源AI项目LocalAI在消费级硬件上运行大模型
无需昂贵GPU:本地部署开源AI项目LocalAI在消费级硬件上运行大模型 随着人工智能技术的快速发展,越来越多的AI模型被广泛应用于各个领域。然而,运行这些模型通常需要高性能的硬件支持,特别是GPU(图形处理器)…...
selenium学习笔记
一.搭建环境 1.安装chrome #下载chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb#安装chrome apt --fix-broken install ./google-chrome-stable_current_amd64.deb2.安装chromedriver 首先先查看版本:google-chrome --…...
SOME/IP协议详解 基础解读 涵盖SOME/IP协议解析 SOME/IP通讯机制 协议特点 错误处理机制
车载以太网协议栈总共可划分为五层,分别为物理层,数据链路层,网络层,传输层,应用层,其中今天所要介绍的内容SOME/IP就是一种应用层协议。 SOME/IP协议内容按照AUTOSAR中的描述,我们可以更进一步…...
nginx 实现 正向代理、反向代理 、SSL(证书配置)、负载均衡 、虚拟域名 ,使用其他中间件监控
我们可以详细地配置 Nginx 来实现正向代理、反向代理、SSL、负载均衡和虚拟域名。同时,我会介绍如何使用一些中间件来监控 Nginx 的状态和性能。 1. 安装 Nginx 如果你还没有安装 Nginx,可以通过以下命令进行安装(以 Ubuntu 为例࿰…...
基于单片机的智能花卉浇水系统的设计与实现
摘要: 随着人们生活水平的不断提高,生活节奏也越来越快。人们经常忽视办公室或者家居的花卉,忘记浇水。本文设计了一种基于单片机的智能浇水系统。目的是解决养殖花卉的人忘记浇水的问题。本系统以单片机AT89S52为控制芯片,能够按…...
《使用 YOLOV8 和 KerasCV 进行高效目标检测》
《使用 YOLOV8 和 KerasCV 进行高效目标检测》 作者:Gitesh Chawda创建日期:2023/06/26最后修改时间:2023/06/26描述:使用 KerasCV 训练自定义 YOLOV8 对象检测模型。 (i) 此示例使用 Keras 2 在 Colab 中…...
【Domain Generalization(3)】领域泛化与文生图之 -- QUOTA 任意领域中的生成物体的数量可控
系列文章目录 【Domain Generalization(1)】增量学习/在线学习/持续学习/迁移学习/多任务学习/元学习/领域适应/领域泛化概念理解第一篇了解了 DG 的概念,那么接下来将介绍 DG 近年在文生图中的相关应用/代表性工作。【Domain Generalization(2)】领域泛化在文生图…...
qml XmlListModel详解
1、概述 XmlListModel是QtQuick用于从XML数据创建只读模型的组件。它可以作为各种view元素的数据源,比如ListView、GridView、PathView等;也可以作为其他和model交互的元素的数据源。通过XmlRole定义角色,如name、age和height,并…...
CAPL如何设置TCP/IP传输层动态端口范围
在TCP/IP协议中,应用程序通过传输层协议TCP/UDP传输数据,接收方传输层收到数据后,根据传输层端口号把接收的数据上交给正确的应用程序。我们可以简单地认为传输层端口号是应用程序的标识,这就是为什么我们说应用程序在使用TCP/IP协议通信时要打开传输层端口号或者绑定端口号…...
Pandas常用数据类型
扩展库pandas常用的数据结构如下: (1)Series:带标签的一维数组 (2)DatetimeIndes:时间序列 (3)DateFrame:带标签且大小可变的二维表格结构 (4…...
【AI大模型】BERT GPT ELMo模型的对比
目录 🍔 BERT, GPT, ELMo之间的不同点 🍔 BERT, GPT, ELMo各自的优点和缺点 🍔 小结 学习目标 理解BERT, GPT, ELMo相互间的不同点理解BERT, GPT, ELMo相互比较下的各自优点和缺点 🍔 BERT, GPT, ELMo之间的不同点 关于特征提取…...
探索AGI:智能助手与自我赋能的新时代
目录 1 AGI1.1 DeepMind Levels(2023年11月)1.2 OpenAI Levels(2024年7月)1.3 对比与总结1.4 AGI可能诞生哪里 2 基于AI的智能自动化助手2.1 通用型大模型2.2 专业的Agent和模型工具开发框架2.3 编程与代码生成助手2.4 视频和多模态生成2.5 商…...
Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步
Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步 目录 Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动…...
webrtc自适应分辨率的设置
DegradationPreference 是一个枚举类,用于在视频编码或实时通信(如 WebRTC)中指定系统资源不足时如何处理质量下降的策略。以下是该枚举类的中文解释: enum class DegradationPreference {// 禁用:不根据资源过载信号…...
提供的 IP 地址 10.0.0.5 和子网掩码位 /26 来计算相关的网络信息
网络和IP地址计算器 https://www.sojson.com/convert/subnetmask.html提供的 IP 地址 10.0.0.5 和子网掩码位 /26 来计算相关的网络信息。 子网掩码转换 子网掩码 /26 的含义二进制表示:/26 表示前 26 位是网络部分,剩下的 6 位是主机部分。对应的子网掩码为 255…...
WPF系列八:图形控件Path
简介 Path控件支持一种称为路径迷你语言(Path Mini-Language)的紧凑字符串格式,用于描述复杂的几何图形。这种语言通过一系列命令字母和坐标来定义路径上的点和线段,最终绘制出想要的图形。 绘制任意形状:可以用来绘…...
如何移除git中被跟踪的commit文件
忽略已被跟踪的文件 问题描述 如果某个文件已经被 Git 跟踪(即已被提交到仓库),即使后来将其添加到 .gitignore 文件中,Git 仍会继续跟踪它。 解决方案 更新 .gitignore 文件 将需要忽略的文件加入 .gitignore: .env…...
15. C语言 函数指针与回调函数
本章目录: 前言什么是函数指针?定义声明方式 函数指针的基本用法示例:最大值函数输出示例: 回调函数与函数指针什么是回调函数?通俗解释 示例:回调函数实现动态数组填充输出示例: 进一步探索:带…...
tomcat12启动流程源码分析
信息: Server.服务器版本: Apache Tomcat/12.0.x-dev 信息: Java虚拟机版本: 21下载源码https://github.com/apache/tomcat,并用idea打开,配置ant编译插件,或者使用我的代码 启动脚本是/bin/startup.bat,内部又执行了bin\cata…...
Pycharm 使用教程
一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的:创建适用于该项目的环境,与系统环境隔离,防止污染系统环境(包括需要的库)虚拟环境配置存放在项目根目录下的 ven…...
数据仓库: 9- 数据仓库数据治理
目录 9- 数据治理9.1 数据标准化9.1.1 数据标准化的定义9.1.2 数据标准化的重要性9.1.3 数据标准化的主要内容9.1.4 数据标准化的实施步骤9.1.5 数据标准化常用工具9.1.6 数据标准化的挑战与应对策略9.1.7 案例分析9.1.8 总结 9.2 主数据管理(MDM)9.2.1 主数据管理的核心目标9.…...
Kutools for Excel 简体中文版 - 官方正版授权
Kutools for Excel 是一款超棒的 Excel 插件,就像给你的 Excel 加了个超能助手。它有 300 多种实用功能,现在还有 AI 帮忙,能把复杂的任务变简单,重复的事儿也能自动搞定,不管是新手还是老手都能用得顺手。有了它&…...
回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测
回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测 目录 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测。 程序设计 完整代码:回…...
lerna使用指南
lerna版本 以下所有配置命令都是基于v8.1.9,lerna v5 v7版本差别较大,在使用时,注意自身的lerna版本。 lerna开启缓存及缓存配置 nx缓存是v5版本以后才有的,小于该版本的无法使用该功能。 初始化配置 缓存配置文件nx.json&am…...
LightGCN:为推荐系统简化图卷积网络的创新之作
LightGCN: Simplifying and Powering Graph Convolution Network for RecommendationSIGIR2020Collaborative Filtering, Recommendation, Embedding Propagation, Graph Neural Network 🌟 研究背景 在信息爆炸的互联网时代,个性化推荐系统成为缓解信…...
【图像去噪】论文精读:High-Quality Self-Supervised Deep Image Denoising(HQ-SSL)
请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 文章目录 前言Abstract1 Introduction2 Convoluti…...
Elasticsarch:使用全文搜索在 ES|QL 中进行过滤 - 8.17
8.17 在 ES|QL 中引入了 match 和 qstr 函数,可用于执行全文过滤。本文介绍了它们的作用、使用方法、与现有文本过滤方法的区别、当前的限制以及未来的改进。 ES|QL 现在包含全文函数,可用于使用文本查询过滤数据。我们将回顾可用的文本过滤方法…...
17.C语言输入输出函数详解:从缓存原理到常用函数用法
目录 1.前言2.缓存和字节流3.printf4.scanf5.sscanf6.getchar与putchar7.puts与gets 1.前言 本篇原文为:C语言输入输出函数详解:从缓存原理到常用函数用法。 更多C进阶、rust、python、逆向等等教程,可点击此链接查看:酷程网 C…...