Day29 多线程

Day29 多线程

一、什么是进程

进程是系统进行资源分配和调用的独立单元,每一个进程都有它的独立内存空间和系统资源。

二、单进程操作系统和多进程操作系统的区别

单进程操作系统:dos(一瞬间只能执行一个任务)

多进程单用户操作系统:Windows(一瞬间只能执行多个任务)

多进程多用户操作系统:Linux(一瞬间只能执行多个任务)

三、现在的多核CPU是否可以让系统在同一个时刻可以执行多个任务吗?

理论上是可以的

四、什么是线程,理解线程和进程的关系

什么是线程?

线程是进程里面的一条执行路径,每个线程同享进程里面的内存空间和系统资源

一个进程 可以有 多个线程:各个线程都有不同的分工

理解线程和进程的关系

进程 与 进程 之间的关系:进程之间的内存空间和系统资源是独立的

同一个进程里的多条线程 :线程之间的内存空间和系统资源是共享的

进程里:可以有一条或一条以上的线程

进程里只有一条线程的情况下,这条线程就叫做主线程

进程里有多条线程的情况下,只有一条线程叫做主线程

Ps:线程是在进程里的,他们是包含关系

五、我们应用的软件有哪些是多线程的应用?

都是

六、Java中,如何来编写多线程的应用程序?有哪些方法?

1.线程类

创建MyThread类,继承Thread,重写run方法

public class Test01 {public static void main(String[] args) {//创建线程的对象MyThread t = new MyThread();//启动线程t.start();}
}
//线程类
class MyThread extends Thread{//当前线程抢到cpu资源后,就会执行run方法@Overridepublic void run() {System.out.println("当前线程抢到资源了");}
}

2.任务类

创建Task类,实现Runnable接口中的run方法

public class Test01 {public static void main(String[] args) {Thread t = new Thread(new Task());t.start();}
}
//任务类
class Task implements Runnable{//当前线程抢到cpu资源后,就会执行run方法@Overridepublic void run() {System.out.println("抢到资源了");}
}

3.带返回值的任务类

4.线程池

七、感受多线程之间争抢资源的场景

需求:编写一个多线程的应用程序,主线程打印1-100之间的数字,子线程打印200-300之间的数字,观察其输出的结果,体会多线程互相争抢资源的场景

public class Test01 {public static void main(String[] args) {MyThread t = new MyThread();t.start();for (int i = 1; i <= 100; i++) {System.out.println("主线程:" + i);}}
}
public class MyThread extends Thread{@Overridepublic void run() {for (int i = 200; i <= 300; i++) {System.out.println("子线程:" + i);}}
}

八、小结

进程 与 进程 的关系:独享内存空间和系统资源

线程 与 进程 的关系:有一个进程中至少包含一个线程

线程 与 线程 的关系:在同一个进程里,多个线程共享内存空间和系统资源

一个进程中包含多个线程,只有一个主线程

经典面试题:请问当我们编写一个单纯的main方法时,此时该程序是否为单线程的?为什么?

垃圾回收器是一个后台线程

九、线程的优先级别

含义:给线程定义抢到CPU资源的优先级

理解:

1.优先级别:1~10,数字越大,优先级越高

2.线程的优先级别不能决定线程是否优先抢到资源,优先级别只能影响(概率问题)

需求:在主线程中创3个子线程,并且设置不同优先级,观察其优先级对线程执行结果的”影响”。

a.setPriority(Thread.MAX_PRIORITY);//10
b.setPriority(Thread.NORM_PRIORITY);//5
c.setPriority(Thread.MIN_PRIORITY);//1

十、给线程自定义名称

  1. 自己写getThreadName/setThreadName
  2. 调用父类的一个参数的构造方法和getName
  3. Thread.currentThread().getName()

十一、让线程休眠

需求:编写一个抽取学员回答问题的程序,要求倒数三秒后输出被抽中的学员姓名

Thread.sleep(1000);

此方法为静态方法,写在哪个线程中,哪个线程就休眠

十二、线程的礼让

需求:创建两个线程A,B,分别各打印1-100的数字,其中B一个线程,每打印一次,就礼让一次,观察实验结果

Thread.yield();

此方法为静态方法,此方法写在哪个线程中,哪个线程就礼让

所谓的礼让是指当前线程退出CPU资源,并转到就绪状态,接着再抢

十三、线程的合并

需求:主线程和子线程各打印200次,从1开始每次增加1,当主线程打印到10之后,让子线程先打印完再打印主线程

t.join(); 合并方法

十四、线程的中断

1、含义: 在 Java 中,线程的中断是一种用于通知线程停止执行的机制。线程的中断由其他线程通过调用 interrupt() 方法来触发。当一个线程被中断时,它会收到一个中断请求,可以根据具体的业务逻辑来决定如何处理这个中断请求。

2、中断机制:

  1. 中断标识:每个线程都有一个中断标识,用于标识线程是否被中断。可以通过 isInterrupted() 方法来查询线程的中断状态,或者通过 interrupted() 方法来查询当前线程的中断状态并清除中断标识。
  2. 中断处理:线程可以通过调用 interrupt() 方法来请求中断自己或其他线程。被中断的线程会收到一个中断请求,可以根据具体的业务逻辑来决定如何处理这个中断请求。
  3. 中断状态:当线程处于阻塞状态(如调用 sleepwaitjoin 等方法时)时,如果收到中断请求,会抛出 InterruptedException 异常,可以在异常处理中进行相应的处理。
  4. 清除中断标识:在处理中断请求后,可以通过 Thread.interrupted() 方法来清除当前线程的中断状态,以便后续的操作不受影响。

十五、守护线程

守护线程 默默守护着前台线程,当所有的前台线程都消亡后,守护线程会自动消亡

注意:垃圾回收器就是守护线程

t.setDaemon(true);

十六、线程局部变量(实现线程范围内的共享变量)

1、含义: 线程局部变量(Thread Local Variables)是一种 Java 中用于实现线程范围内的共享变量的机制。它允许每个线程都拥有自己独立的变量副本,从而在多线程环境下实现共享变量的线程封闭性。

2、应用场景: 线程局部变量通常用于需要在线程范围内共享变量,但又需要保持线程封闭性的场景,例如线程池中的任务、Web 应用中的用户会话信息等。通过线程局部变量,可以更加安全地在多线程环境下共享变量。

十七、线程的生命周期

1、新建状态

i. 在程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态,此时,它已经有了相应的内存空间和其它资源,但还处于不可运行状态。新建一个线程对象可采用线程构造方法来实现。

ii. 例如:Thread thread=new Thread();

2、 就绪状态

i. 新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程进入就绪状态。此时,线程将进入线程队列排队,等待CPU调用,这表明它已经具备了运行条件。

3、运行状态

i. 当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象的run()方法。run()方法定义了该线程的操作和功能。

4、 阻塞状态

i. 一个正在执行的线程在某些特殊情况下,如被人为挂起,将让出CPU并暂时中止自己的执行,进入阻塞状态。在可执行状态下,如果调用sleep(2000)、wait()等方法,线程都将进入阻塞状态。阻塞时,线程不能进入排队队列,只有当引起阻塞的原因被消除后,线程才可以转入就绪状态。

5、死亡状态

i. 线程调用stop()方法时或run()方法执行结束后,线程即处于死亡状态。处于死亡状态的线程不具有继续运行的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spire.PDF for .NET【文档操作】演示:合并 PDF 文件并添加页码

搜索了这么多有关 PDF 合并的信息后&#xff0c;很容易发现&#xff0c;无论您在线合并 PDF 文件还是使用 C#/VB.NET 来实现此任务&#xff0c;您都无法逃避对 PDF 文件安全等一些重要问题的担忧&#xff0c;因此需要花费多少时间或者合并后的文件是否支持打印页码等等。不过&a…

Python深度学习033:Python、PyTorch、CUDA和显卡驱动之间的关系

Python、PyTorch、CUDA和显卡驱动之间的关系相当紧密,它们共同构成了一个能够执行深度学习模型的高效计算环境。下面是它们之间关系的简要概述: Python Python 是一种编程语言,广泛用于科学计算、数据分析和机器学习。它是开发和运行PyTorch代码的基础环境。PyTorch PyTorc…

VSCode中6个AI顶级插件

Visual Studio Code (VSCode) 是通往一系列 AI 驱动的编码支持的门户。探索精心挑选的 VSCode 顶级扩展&#xff0c;这些扩展利用人工智能的强大功能&#xff0c;包括 GitHub Copilot、TabNine 等著名工具。 1. GitHub Copilot&#xff1a;你的强人工智能结对程序员 GitHub Co…

【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

Word、Excel、PPT文件转PDF文件(C#)

一、添加依赖 为wpf项目引用Microsoft.Office.Interop.Excel、Microsoft.Office.Interop.PowerPoint、Microsoft.Office.Interop.Word、Office&#xff0c;依赖文件已经打到源代码包里了。 二、先定义一些命名空间 using Word Microsoft.Office.Interop.Word;using Excel M…

零基础入门转录组数据分析——DESeq2差异分析

零基础入门转录组数据分析——DESeq2差异分析 目录 零基础入门转录组数据分析——DESeq2差异分析1. 转录组分析基础知识2. DESeq2差异分析&#xff08;Rstudio&#xff09;3. 结语 1. 转录组分析基础知识 1.1 什么是转录组&#xff1f; 转录组&#xff08;transcriptome&#…

n1.线性表及其实现

1.引入—多项式表示 对于多项式&#xff0c;如何使用程序进行编写呢&#xff1f; 方法一&#xff1a;一维数组。下标对应未知数的指数&#xff0c;元素个体对应系数。缺点就是都得全部表示&#xff0c;系数为0项的存在浪费空间。例如&#xff0c;x只有一次方和2000次方&#…

MySQL、Oracle查看字节和字符长度个数的函数

目录 0. 总结1. MySQL1.1. 造数据1.2. 查看字符/字节个数 2. Oracle2.1. 造数据2.2. 查看字符/字节个数 0. 总结 databasecharacterbyteMySQLchar_length()length()Oraclelength()lengthB() 1. MySQL 1.1. 造数据 drop table if exists demo; create table demo (id …

手机一键换ip地址,解锁网络自由

在数字化时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着移动互联网的快速发展&#xff0c;手机用户对于网络安全和隐私保护的需求也日益增强。其中&#xff0c;IP地址作为手机在网络中的标识&#xff0c;扮演着重要的角色。有时&#xff0c;出于隐私保护或网络…

std::deque(双端队列)

std::deque&#xff08;双端队列&#xff09;是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它提供了在队列的两端进行插入和删除操作的高效实现。std::deque 可以被视为一个固定大小的数组&#xff0c;但它可以动态增长和缩减&#xff0c;且不需要在…

关于oracle切换mysql8总结

最近由于项目换库&#xff0c;特此记录 1.字段类型 number(8) -> int(8) number(16) -> bigint(16) varchar2() -> varchar() 2.导数据 从oracle迁移数据到mysql&#xff0c;除了用专门的数据泵&#xff0c;经常需要用csv导入到mysql&#xff1b; 导出的csv数据如果…

【bugfix】如何解决svg到线上显示空白或者svg的viewBox为空

svgo的默认机制是当width和height和viewbox一样会删除viewbox&#xff0c;这都是为了svg的压缩做的&#xff0c;详情可以看issue中的讨论&#xff0c;我们可以通过更改babel的配置来解决 https://github.com/svg/svgo/issues/1128 https://github.com/ant-design/ant-design-we…

WebSocket用户验证

在WebSocket中&#xff0c;如何携带用户的验证信息 一、在OnMessage中进行验证 客户端在连接到服务器后&#xff0c;客户端通过发送消息&#xff0c;服务器端在OnMessage方法中&#xff0c;进行信息验证&#xff0c;这种方式需要将用户身份验证及接收用户消息进行混合处理&am…

Python人工智能:推动气象科学研究与技术进步的新动力

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

竞赛常考的知识点大总结(七)图论

最短路 最短路问题&#xff08;Shortest Path Problem&#xff09;是图论中的一个经典问题&#xff0c;它要求在给定的图中找到两个顶点之间的最短路径。最短路问题可以是单源最短路问题&#xff08;从一个顶点到其他所有顶点的最短路径&#xff09;或所有对最短路问题&#x…

Oracle 数据库中的全文搜索

Oracle 数据库中的全文搜索 0. 引言1. 整体流程2. 创建索引2-1. 创建一个简单的表2-2. 创建文本索引2-3. 查看创建的基础表 3. 运行查询3-1. 运行文本查询3-2. CONTAINS 运算符3-3. 混合查询3-4. OR 查询3-5. 通配符3-6. 短语搜索3-7. 模糊搜索&#xff08;Fuzzy searches&…

详细解释Javaweb、Spring和Spring Boot对数据库的使用

在传统的Javaweb中&#xff0c;对数据库进行访问通常使用JDBC&#xff08;Java Database Connectivity&#xff09;来实现。以下是一个简单的示例&#xff0c;演示如何使用JDBC连接数据库并执行查询操作&#xff1a; java import java.sql.Connection; import java.sql.Drive…

2021-08-06

yarn的简介&#xff1a; Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点&#xff1a; 速度超快。 Yarn 缓存了每个下载过的包&#xff0c;所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率&#xff0c;因此安装速度更快。超级安全。 在执行代码…

ChatGPT技巧分享:如何用AI提升学术写作水平

ChatGPT无限次数:点击直达 ChatGPT技巧分享&#xff1a;如何用AI提升学术写作水平 在当今信息爆炸的时代&#xff0c;学术写作是一个重要的技能&#xff0c;但如何提高自己的学术写作水平呢&#xff1f;AI技术的发展为我们提供了更多可能&#xff0c;其中ChatGPT作为一种强大的…

Redis性能瓶颈与安全隐患排查验证纪实

在写《Redis怎样保证数据安全&#xff1f;》这篇文章&#xff0c;我是有对redis设置密码需要哪些步骤&#xff0c;设置密码的性能损耗有验证的。这就涉及到要对redis的配置做修改。 开始时我是打算采用直接使用redis配置文件的方式。所以我从redis官网下载了一个默认的配置文件…