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

多线程的创建

一、基本概念

1 cpu

CPU的中文名称是中央处理器,是进行逻辑运算用的,主要由运算器、控制器、寄存器三部分组成,从字面意思看就是运算就是起着运算的作用,控制器就是负责发出cpu每条指令所需要的信息,寄存器就是保存运算或者指令的一些临时文件,这样可以保证更高的速度。也就是我们的线程运行在cpu之上。

2 进程/线程

进程是资源分配最小单位,线程是程序执行的最小单位。 计算机在执行程序时,会为程序创建相应的进程,进行资源分配时,是以进程为单位进行相应的分配。每个进程都有相应的线程,在执行程序时,实际上是执行相应的一系列线程

  • 总结:进程是资源分配最小单位,线程是程序执行的最小单位

  • 什么是进程:

    1. cpu从硬盘中读取一段程序到内存中,该执行程序的实例就叫做进程

    2. 一个程序如果被cpu多次被读取到内存中,则变成多个独立的进程

  • 什么是线程:

    线程是程序执行的最小单位,在一个进程中可以有多个不同的线程同时执行。

3 多线程优点

采用多线程的形式执行代码,目的就是为了提高程序的效率。

比如:现在一个项目只有一个程序员开发,需要开发功能模块会员模块、支付模块、订单模块。

如果小军,小明,小薇的开发水平一样,一个人5天只能完成一个模块,那么一个人完成全部工作需要15天,3个人同时完成这些工作只需要5天。

4 并行/串行

串行也就是单线程执行 代码执行效率非常低,代码从上向下执行; (同步操作)

并行就是多个线程并行一起执行,效率比较高。 (异步操作)

并发指两个或多个事件在同一个时间段内发生。

5 CPU时间片

  1. 单核的cpu上每次只能够执行一次线程,如果在单核的cpu上开启了多线程,则会发生对每个线程轮流执行 。

  2. Cpu每次单个计算的时间成为一个cpu时间片,实际只有几十毫秒人为感觉好像是在多线程。

  3. 对于线程来说,存在等待cpu调度的时候 该线程的状态是为就绪状态,如果被cpu调度则该线程的状态为运行状态

  4. 当cpu转让执行其他的线程时,则该线程有变为就绪状态。

6 计算密集型/IO密集型

计算密集型:长时间占用cpu;例如: 视频剪辑

IO密集型 :cpu计算时间短 , 访问外接设备时间长Input/output

7 上下文切换

多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候,就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。

二、创建方式

创建方式:

  • 继承Thread类创建线程

  • 实现Runnable接口创建线程

  • 使用Callable和Future创建线程

  • 使用线程池例如用Executor框架

  • 使用匿名内部类的形式创建线程

  • 使用lambda表达式创建线程

1 继承Thread类创建线程

public class ThreadDemo01 extends Thread{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"在运行");}public static void main(String[] args) {ThreadDemo01 demo01 = new ThreadDemo01();demo01.start();}
}

2 实现Runnable接口创建线程

public class ThreadDemo02 implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ",我是子线程");}public static void main(String[] args) {new Thread(new ThreadDemo02()).start();}
}

3 使用Callable和Future创建线程

从Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以看作是线程的执行体,但call()方法比run()方法更强大。

call()方法可以有返回值。

call()方法可以声明抛出异常。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class ThreadCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {System.out.println(Thread.currentThread().getName());return 1;}public static void main(String[] args) throws ExecutionException, InterruptedException {ThreadCallable callable = new ThreadCallable();FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);new Thread(futureTask).start();Integer result = futureTask.get();System.out.println(result);}
}

4 使用线程池例如用Executor框架

public class ThreadDemo03{public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool();//方法参数是Runnable的实现类service.execute(()->System.out.println(Thread.currentThread().getName() + ">我是子线程<"));}
}

5 使用匿名内部类的形式创建线程

public class ThreadDemo04 {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}}).start();}
}

6 使用lambda表达式创建线程

public class ThreadDemo04 {public static void main(String[] args) {new Thread(()->System.out.println(Thread.currentThread().getName())).start();}
}

7 Thread和Runnable的区别

实现Runnable接口比继承Thread类所具有的优势:

  1. 适合多个相同的程序代码的线程去共享同一个资源。

  2. 可以避免java中的单继承的局限性。

  3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。

  4. 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。

 三、线程状态

 

1 新建

当用new关键字创建一个线程时,还没调用start 就是新建状态。

2 就绪

调用了 start 方法之后,线程就进入了就绪阶段。此时,线程不会立即执行run方法,需要等待获取CPU资源。

3 运行

当线程获得CPU时间片后,就会进入运行状态,开始执行run方法。

4 阻塞

当遇到以下几种情况,线程会从运行状态进入到阻塞状态。

  • 调用wait方法,jvm会将线程放入等待队列(waiting queue),使线程进入等待。

  • 当线程去获取同步锁的时候,锁正在被其他线程持有,jvm会将该线程放入锁池(lock pool)

  • 其他阻塞,运行状态的线程调用sleep方法、join方法,或者进入io请求的时候,会导致线程阻塞。

需要注意的是,阻塞状态只能进入就绪状态,不能直接进入运行状态。因为,从就绪状态到运行状态的切换是不受线程自己控制的,而是由线程调度器所决定。只有当线程获得了CPU时间片之后,才会进入运行状态。

5 死亡

当run方法正常执行结束时,或者由于某种原因抛出异常都会使线程进入死亡状态。另外,直接调用stop方法也会停止线程。但是,此方法已经被弃用,不推荐使用。

四、线程的基本方法

1 线程等待:wait方法

  • 调用wait()方法,线程会进入WATING状态,只有等到其他线程的通知活被中断后才会返回。需要注意的是,在调用wait()方法的后会释放对象的锁,因此wait()方法一般被用到同步方法或者同步代码块中。

2 线程睡眠:sleep方法

  • 用sleep方法会导致当前线程休眠。与 wait方法不同的是,sleep方法不会释放当前占有的锁,会导致线程进人 TIMED-WATING 状态,而 wait方法会导致当前线程进入WATING.

3 线程让步: yield 方法

调用yield 方法会使当前线程让出(释放)CPU执行时间片,与其他线程一起重新竞争CPU 时间片。在一般情况下,优先级高的线程更有可能竞争到CPU时间片,但这不是绝对的,有的操作系统对线程的优先级并不敏感。

4 线程中断:interrupt方法

  • interrupt方法用于向线程发行一个终止通知信号,会影响该线程内部的一个中断标识位,这个线程本身并不会因为调用了interrupt方法而改变状态(阻塞、终止等)。状态的具体变化需要等待接收到中断标识的程序的最终处理结果来判定。

5 线程加入 join方法

8 start方法和run方法的区别

  • join方法用于等待其他线程终止,如果在当前线程中调用一个线程的 join方法,则当前线程转为阻塞状态,等到另一个线程结束,当前线程再由阻塞状态转为就绪状态,等待获取CPU 的使用权。在很多情况下,主线程生成并启动了子线程,需要等到子线程返回结果并收集和处理再退出,这时就要用到join方法,具体的使用方法如下:

    System.out.println(”子线程运行开始!"):
    ChildThread childThread - new ChildThread();
    childThread.join(0);//等待子线程childThread执行结束
    System.out.println("子线join ()结束,开始运行主线程");

    6 线程唤醒: notify方法

    Object类有个 notify方法,用于唤醒在此对象监视器上等待的一个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的我们通常调用其中一个对象的 wait方法在对象的监视器上等待 直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他线程竞争。类似的方法还有notifyAll,用于唤醒在监视器上等待的所有线程。

    7 sleep方法与 wait方法的区别如下:

  • sleep方法属于Thread类,wait方法则属于Object类。

  • sleep方法暂停执行指定的时间,让出 CPU 给其他线程,但监控器状态依然保持在指定的时间过后又会自动恢复运行状态。

  • start方法用于启动线程,真正实现了多线程运行。在调用了线程的start方法后,线程会在后台执行,无须等待run方法体的代码执行完毕,就可以继续执行下面的代码。

  • 在通过调用 Thread 类的 start方法启动一个线程时,此线程处于就绪状态,并没有运行。

  • run方法也叫作线程体,包含了要执行的线程的逻辑代码,在调用run方法后,线程就进入运行状态,开始运行 run方法中的代码。在run方法运行结束后,该线程终止,CPU再调度其他线程

  • 在调用sleep方法的时候线程不会释放对象锁。

  • 在调用wait方法时,线程会放弃对象锁,进入等此对象的等待锁池,只有针对此对象调用notify方法后,该线程才能进人对象锁池准备获取对象锁,并进入运行状态。

 五、线程安全问题

1 问题出现的原因

如果有多个线程在同时运行,而这些线程可能会同时操作一个变量。程序每次运行结果和单线程运行的结果是一样

的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

# 我们通过一个案例,演示线程的安全问题: 电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是 “葫芦娃大战奥特曼”,本次电影的座位共100个 
(本场电影只能卖100张票)。 
我们来模拟电影院的售票窗口,实现多个窗口同时卖 “葫芦娃大战奥特曼”这场电影票(多个窗口一起卖这100张票) 
需要窗口,采用线程对象来模拟;需要票,Runnable接口子类来模拟
public class Ticket implements Runnable {private int ticket = 100;/** 执行卖票操作*/@Overridepublic void run() {//每个窗口卖票的操作//窗口 永远开启while (true) {if (ticket > 0) {//有票 可以卖//出票操作//使用sleep模拟一下出票时间try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//获取当前线程对象的名字String name = Thread.currentThread().getName();System.out.println(name + "正在卖:" + ticket--);}}}
}
public class Demo01 {public static void main(String[] args) {Ticket ticket = new Ticket();Thread t1 = new Thread(ticket, "窗口1");Thread t2 = new Thread(ticket, "窗口2");t1.start();t2.start();}
}

 

可以看到同一张票被买了两次,这种问题,几个窗口(线程)票数不同步了,这种问题称为线程不安全。

线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写 操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步, 否则的话就可能影响线程安全。

2 如何解决问题

当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题。 要解决上述多线程并发访问一个资源的安全性问题:也就是解决重复票与不存在票问题,Java中提供了同步机制(synchronized)来解决。

窗口1线程进入操作的时候,窗口2线程只能在外等着,窗口1操作结束,窗口1和窗口2才有机会进入代码 去执行。也就是说在某个线程修改共享资源的时候,其他线程不能修改该资源,等待修改完毕同步之后,才能去抢夺CPU 资源,完成对应的操作,保证了数据的同步性,解决了线程不安全的现象。

3 解决方法

  • 同步代码块。

  • 同步方法。

  • 锁机制

 

 同步代码块

同步锁:

对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁.

  • 锁对象 可以是任意类型。

  • 多个线程对象 要使用同一把锁。

注意:在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他的线程只能在外等着(BLOCKED)。

synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。

格式:

synchronized(同步锁){需要同步操作的代码
}
public class Ticket implements Runnable {private int ticket = 100;Object lock = new Object();/** 执行卖票操作*/@Overridepublic void run() {//每个窗口卖票的操作//窗口 永远开启while (true) {synchronized (lock){if (ticket > 0) {//有票 可以卖//出票操作//使用sleep模拟一下出票时间try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//获取当前线程对象的名字String name = Thread.currentThread().getName();System.out.println(name + "正在卖:" + ticket--);}}}}
}

当使用了同步代码块后,上述的线程的安全问题,解决了。

 

同步方法

同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外 等着。

同步锁是谁?

  • 对于非static方法,同步锁就是this。

  • 对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。

格式:

public synchronized void method(){可能会产生线程安全问题的代码
}
public class Ticket implements Runnable {private int ticket = 100;@Overridepublic void run() {//每个窗口卖票的操作 ,窗口 永远开启while(true){sellTicket();}}/** 锁对象 是 谁调用这个方法 就是谁* 隐含 锁对象 就是 this**/public synchronized void sellTicket(){if(ticket>0){//有票 可以卖//出票操作//使用sleep模拟一下出票时间try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//获取当前线程对象的名字String name = Thread.currentThread().getName();System.out.println(name+"正在卖:"+ticket--);}}
}

Lock锁

java.util.concurrent.locks.Lock 机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作, 同步代码块/同步方法具有的功能Lock都有,除此之外更强大,更体现面向对象。

Lock锁也称同步锁,加锁与释放锁方法化了,如下:

  • public void lock() :加同步锁。

  • public void unlock() :释放同步锁。

语法格式

Lock lock = new ReentrantLock();
try{lock.lock();//加锁操作
}finally{lock.unlock();
}
public class Ticket implements Runnable {private int ticket = 100;Lock lock = new ReentrantLock();/** 执行卖票操作*/@Overridepublic void run() {//每个窗口卖票的操作永远开启while(true){lock.lock();if(ticket>0){//有票 可以卖//出票操作//使用sleep模拟一下出票时间try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}//获取当前线程对象的名字String name = Thread.currentThread().getName();System.out.println(name+"正在卖:"+ticket--);}lock.unlock();}}
}

相关文章:

多线程的创建

一、基本概念 1 cpu CPU的中文名称是中央处理器&#xff0c;是进行逻辑运算用的&#xff0c;主要由运算器、控制器、寄存器三部分组成&#xff0c;从字面意思看就是运算就是起着运算的作用&#xff0c;控制器就是负责发出cpu每条指令所需要的信息&#xff0c;寄存器就是保存运…...

【django】APPEND_SLASH 路由末尾的斜杠问题

url路由末尾是否加斜杠的规范 加斜杠&#xff1a;表示是目录不加斜杠&#xff1a; 表示是文件 在django中的setting中&#xff0c;默认APPEND_SLASH True, 即当请求的路由末尾没有加斜杠&#xff0c; 如果尝试加上斜杠后&#xff0c;能在后端路由里匹配到&#xff0c;则会自…...

iOS16.0:屏幕旋转

此文写于2022年08月03日&#xff0c;距离iOS16正式版推出还有一个多月的时间&#xff0c;iOS16 beta版本有很多API的修改&#xff0c;今天讨论的是屏幕旋转&#xff0c;基于Xcode 14.0 beta4。 之前的屏幕旋转会报错&#xff1a; [Orientation] BUG IN CLIENT OF UIKIT: Settin…...

Carla学习笔记(二)服务器跑carla,本地运行carla-ros-bridge并用rviz显示

一、服务器跑carla 详见Carla学习笔记&#xff08;一&#xff09;服务器跑carla本地显示窗口_Zero_979的博客-CSDN博客 只需要启动服务器端就行&#xff1a; ./CarlaUE4.sh -carla-rpc-port2000 -RenderOffScreen -graphicsadaper1 二、本地下载 carla-ros-bridge 官方库&…...

数学建模--退火算法求解最值的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 """ 1.设定退火算法的基础参数 2.设定需要优化的函数,求解该函数的最小值/最大值 3.进行退火过程&#xff0c;随机产生退火解并且纠正,直到冷却 4.绘制可视化图片进行了解退火整体过程 &…...

地理地形sdk:Tatuk GIS Developer Kernel for .NET Crack

Tatuk GIS Developer Kernel for .NET 是一个变体&#xff0c;它是受控代码和 .NET GIS SDK&#xff0c;用于为用户 Windows 操作系统创建专业 GIS 软件的过程。它被认为是一个完全针对Win Forms 的.NET CIL&#xff0c;WPF 框架是针对C# 以及VB.NET、VC、Oxy 以及最终与.NET 的…...

Day_81-87 CNN卷积神经网络

目录 一. CNN卷积神经网络与传统神经网络的不同 1. 模型图 2. 参数分布情况 3. 卷积神经网络和传统神经网络的层次结构 4. 传统神经网络的缺点&#xff1a; 二. CNN的基本操作 1. 卷积 2. 池化 三. CNN实现过程 1. 算法流程图 2. 输入层 3. 卷积层 4. 激活层 5. 池化层 6. 全连…...

关于mybatisplus报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplat的问题

可能是mybatisplus版本不兼容的问题&#xff0c;我之前用的3.4.0&#xff0c;springboot版本是3.1.3&#xff0c;maven版本是3.8.8&#xff0c;运行的时候报了这个错。现在修改了mybatisplus的版本&#xff0c;如下图&#xff1a; 这样就不报错了。 大家可以在这里找合适的my…...

Spring AOP基础动态代理基于JDK动态代理实现

目录 1. 预备知识-动态代理 1.1 什么是动态代理 1.2 动态代理的优势 1.3 基于JDK动态代理实现 2. AOP 2.1 基本概念 2.2 AOP带来的好处 3. Spring AOP 3.1 前置通知 3.2 后置通知 3.3 环绕通知 3.4 异常通知 3.5 适配器 1. 预备知识-动态代理 1.1 什么是动态代理…...

第一章 计算机系统概述 五、中断和异常、系统调用

目录 一、中断的作用 二、中断的类型 1、内中断&#xff08;异常&#xff09; 2、外中断 三、中断机制的基本原理 四、系统调用 1、定义&#xff1a; 2、与库函数的区别 3、按功能分类 4、作用 一、中断的作用 1、“中断”是让操作系统内核夺回CPU使用权的唯一途径 …...

【C语言】文件操作(上)

一.什么是文件 文件是磁盘上的文件,文件中存放的数据不随程序的退出而销毁. 二.文件的打开与关闭 1.文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区&#xff0c;用来存放文件的相关信息&#xff08;如文件的名字&#xff0c;文件状态及文件当前的位置等&…...

【Linux】让笔记本发挥余热,Ubuntu20.04设置WiFi热点

Ubuntu20.04设置WiFi热点 由于卧室距离客厅较远&#xff0c;wifi信号太弱&#xff0c;体验极差。鉴于卧室的笔记本电脑是通过网线连接的客厅路由器&#xff0c;因此考虑将这台老破笔记本作为“路由器”&#xff0c;以便发挥它的余热。实验证明&#xff0c;上网速度提升数十倍&a…...

【云平台】遥感地信云平台收录

文章目录 国内1 航天宏图PIE-Engine2 商汤科技3 AI Earth4 EarthDataMiner国外结语国内 1 航天宏图PIE-Engine https://engine.piesat.cn/live-show-list 在这里插入图片描述 2 商汤科技 https://senseearth-cloud.com/map 3 AI Earth https://engine-aiearth.aliyun.com…...

23种设计模式之---单例模式

闲来无事学一下设计模式&#xff0c;希望这23种可以一直更下去&#xff0c;什么时候能更完呢&#xff0c;也许一个月&#xff0c;也许一年&#xff0c;也许断更 设计模式六大原则 本文是23篇的第一篇&#xff0c;在学习设计模式之前&#xff0c;你需要了解下六大原则。 1、开…...

蓝桥杯官网练习题(纸牌三角形)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 A,2,3,4,5,6,7,8,9 共 99 张纸牌排成一个正三角形&#xff08;A 按 1 计算&#xff09;。要求每个边的和相等。 下图就是一种排法。 这样的排法可能会有很多。 如果…...

一辆新能源汽车的诞生之旅:比亚迪常州工厂探营

作为在新能源汽车领域首屈一指的国产品牌&#xff0c;比亚迪近年来可以说是捷报频传&#xff0c;高奏凯歌。 以比亚迪常州工厂为例&#xff0c;据介绍该工厂当初规划设计时定下的生产目标&#xff0c;是年产量能够达到20万辆。然而在2023年上半年&#xff0c;该工厂光是主要销往…...

【算法专题突破】双指针 - 最大连续1的个数 III(11)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;1004. 最大连续1的个数 III - 力扣&#xff08;Leetcode&#xff09; 这道题不难理解&#xff0c;其实就是求出最长的连续是1的子数组&#xff0c; 但是&#xff0c;他支…...

java实现备忘录模式

备忘录模式是一种行为设计模式&#xff0c;它允许您捕获一个对象的内部状态&#xff0c;并在稍后的时间点将其恢复。这对于需要撤销操作或恢复到先前状态的应用程序非常有用。以下是在 Java 中实现备忘录模式的一般步骤&#xff1a; 创建一个原发器类&#xff08;Originator&am…...

aardio语言的通用数据表维护

import win.ui; /*DSG{{*/ var winform win.form(text"通用数据表维护";right617;bottom427;bgcolor15780518) winform.add( buttonAdd{cls"button";text"增加空行";left469;top40;right564;bottom80;flat1;z2}; buttonDel{cls"button&quo…...

手写RPC框架--7.封装响应

RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 封装响应 封装响应a.封装响应b.请求id生成器(雪花算法)c.抽象序列化d.建立序列化工厂e.hessian的序列化方式&#xff08;拓展&#xff09; 封装响应 a.封装响应 在core模块…...

Linux入门教程||Linux系统目录结构

登录系统后&#xff0c;在当前命令窗口下输入命令&#xff1a; ls / 你会看到如下图所示: 树状目录结构&#xff1a; 以下是对这些目录的解释&#xff1a; /bin&#xff1a; bin是Binary的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里存放的是启动Linux时…...

LeetCode 88. 合并两个有序数组

文章目录 一、题目二、C# 题解 一、题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&a…...

C语言实现扫雷小游戏

1.首先扫雷游戏要存储布置好的雷信息&#xff0c;需要一个二维数组 不是雷放* 雷&#xff1a;# 不是雷&#xff1a;0 雷&#xff1a;1 2. 给2个二维数组 9*9 一个存放雷的信息&#xff0c;一个存放布置好雷的信息 3.为了防止在统计坐标周围的…...

【linux基础(五)】Linux中的开发工具(上)---yum和vim

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux中的开发工具 1. 前言2.…...

C++学习之list的实现

在了解学习list实现之前我们首先了解一下关于迭代器的分类&#xff1a; 按功能分类&#xff1a; 正向迭代器 反向迭代器 const正向迭代器 const反向迭代器 按性质分类&#xff1a; 单向迭代器 只能 例如单链表 双向迭代器 可&#xff0c;也可-- 例如双…...

一种高效且节约内存的聚合数据结构的实现

一种高效且节约内存的聚合数据结构的实现 在特定的场景中&#xff0c;特殊定制数据结构能够得到更加好的性能且更节约内存。 聚合函数GroupArray的问题 GroupArray聚合函数是将分组内容组成一个个数组&#xff0c;例如下面的例子&#xff1a; SELECT groupArray(concat(ABC…...

机器学习(10)---特征选择

文章目录 一、概述二、Filter过滤法2.1 过滤法说明2.2 方差过滤2.3 方差过滤对模型影响 三、相关性过滤3.1 卡方过滤3.2 F检验3.3 互信息法3.4 过滤法总结 四、Embedded嵌入法4.1 嵌入法说明4.2 以随机森林为例的嵌入法 五、Wrapper包装法5.1 包装法说明5.2 以随机森林为例的包…...

Python之数据库(MYSQL)连接

一&#xff09;数据库SQL语言基础 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database…...

【建站教程】使用阿里云服务器怎么搭建网站?

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网以搭建WordPress网站博客为例&#xff0c;阿小云来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&#x…...

【自然语言处理】关系抽取 —— MPDD 讲解

MPDD 论文信息 标题:MPDD: A Multi-Party Dialogue Dataset for Analysis of Emotions and Interpersonal Relationships 作者:Yi-Ting Chen, Hen-Hsen Huang, Hsin-Hsi Chen 期刊:LREC 2020 发布时间与更新时间:2020 主题:自然语言处理、关系抽取、对话场景、情感预测 数…...

如何设计网站导航/我想做网络推广找谁

我这里从操作目的出发说明linux命令&#xff0c;而不是将linux命令逐个说明用法、注意事项&#xff0c;毕竟我只是一个测试人员&#xff0c;而不是一个专职的linux运维人员&#xff0c;无须掌握所有的命令&#xff0c;掌握每个命令的所有用法&#xff1b;1、查看当前目录下有哪…...

卖挂的网站怎么做/手机怎么建自己的网站

Android 资源(Resources)访问有许多东西用来构建一个优秀的 Android 应用程序。除了应用程序的编码&#xff0c;你需要关注各种各样的资源&#xff0c;诸如你用到的各种静态内容&#xff0c;如位图&#xff0c;颜色&#xff0c;布局定义&#xff0c;用户界面字符串&#xff0c;…...

做外汇网站代理/网络营销是什么

然而并没有什么好论的。。。 直接贴代码算了。。。 ll Mul(ll x,ll y,ll Mod){x(x%ModMod)%Mod;y(y%ModMod)%Mod;return (x*y-(long long)((long double)x/Mod*y0.5)*ModMod)%Mod; } 转载于:https://www.cnblogs.com/yanshannan/p/9649887.html...

免费黄页营销网站/seo排名快速上升

1位1比特&#xff1b;1字2字节&#xff1b;1字节8位&#xff1b;1字16位。 1、位 位是计算机存储的最小单位&#xff0c;简记为b&#xff0c;也称为比特&#xff08;bit&#xff09;计算机中用二进制中的0和1来表示数据&#xff0c;一个0或1就代表一位。位数通常指计算机中一次…...

建设小说网站首页/全能优化大师

作者&#xff1a; 阮一峰 日期&#xff1a; 2016年9月18日 一年半前&#xff0c;我写了《React 入门实例教程》&#xff0c;介绍了 React 的基本用法。 但是&#xff0c;React 只是 DOM 的一个抽象层&#xff0c;并不是 Web 应用的完整解决方案。也就是说&#xff0c;只用 Reac…...

eclipse做购物网站/福州seo技术培训

对于刚开始学QT的同学&#xff0c;在网上搜索许久之后会发现&#xff1a;一个简 单的 Qt 程序下面这个小程序&#xff0c;估计大家会感到比较亲切。似乎有相当多的中文用户尝试写过这样的代码&#xff1a;#include #include int main(int argc, char **argv){QApplication app(…...