【JavaEE】多线程编程引入——认识Thread类

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你!

目录

引入:

一:Thread类

1:Thread类可以直接调用

2:run方法

(1)主线程:

(2)Thread创建实例

3:start方法

4:内核

(1)用户态:

(2)内核态:

(3)危害

二:线程的随机调度

1:随机调度

(1)调度器

(2)“抢占式执行”

(3)打印结果分析:

2:jconsole工具

3:sleep方法

4:异常捕获


引入:

通过前面的学习,我们了解到现在主流的编程方式为,多进程编程和多线程编程

在java中并不推荐使用多进程编程这种方式,因为很多跟多进程编程有关的api,Java标准库中都没有提供。

但是多线程不一样,操作系统给我们提供了很多api,但是这些api都是C++、C实现的,api风格也是C++/C的。所以JVM就把这些api给封装成JAVA代码能使用的api,咱们就可以直接使用了嘿嘿~

补充:跑起来的程序叫进程,没跑起来的程序(.exe可执行文件)

一:Thread类

class MyThread extends Thread{@Overridepublic void run() {System.out.println("这就是进入该线程的入口");}
}
public class ThreadDemo1 {public static void main(String[] args) {//根据类,创建实例,线程实例才是真正的线程//一般用向上转型的写法Thread t = new MyThread();t.start();}
}

1:Thread类可以直接调用

不需要导包,因为它包含在java一个很特殊的包里java.lang(可以想象你写String,Int这些类的时候有没有导包,没有吧,Thread也是一样的)

2:run方法

(1)主线程:

一个进程中至少有一个线程,进程中的第一个线程就叫做“主线程”,上面图片中的main方法就是主线程

(2)Thread创建实例

重写的run方法是另一个线程的入口,相当于main函数入口,根据Thread类创建实例,线程实例才是真正的线程,一般我们用Thread向上转型的写法,不用MyTthread创建实例,

注:方法的重写本质上是让你可以对现有的类进行扩展

3:start方法

创建完实例之后,调用Thread中的start方法,才会真正的调用系统的api,在系统的内核中创建出线程

注:当引入线程后,代码就可以同时具备多个执行流了

4:内核

操作系统 = 内核 + 其他配套的应用程序。内核是操作系统核心模块。

我们把把空间分为内核空间(内核态),和用户空间(用户态)

(1)用户态:

当一些应用程序(像咱们常用的qq,微信,浏览器,爱奇艺啥的)在执行一些常规操作的时候,就会由操作系统提供一些已经封装好的api,然后这些应用程序调用api在用户空间内完成一些常规操作,这些操作可以视为“合法操作”并不会对软硬件造成什么潜在危害。

(2)内核态:

但是有些程序需要针对软硬件资源进行操作的时候(这些操作是比较危险的),就需要向系统获取更高权限,进入内核空间去调用相应的api

(3)危害

如果让程序直接操作软硬件,出个什么bug之类的,可能会把硬件直接干冒烟这种情况(像我们学51单片机的时候,经常出现芯片被烧的情况)

二:线程的随机调度

class MyThread2 extends Thread{@Overridepublic void run() {while (true){System.out.println("run方法");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class ThreadDemo2 {public static void main(String[] args) {Thread t = new MyThread2();t.start();while (true){System.out.println("main方法");//同时打印try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

前引:我们运行上述代码,观察这两个线程(main,run)究竟谁先打印

<——————打印结果

1:随机调度

(1)调度器

上述代码是两个死循环,但是代码执行的时候并没有报错,而是在无限打印(结果如上),说明这是两个独立的执行流,互不干扰,但是这些线程执行的顺序是不一样的(从打印结果上可以看出来),这里涉及到操作系统中,有一个在内核当中的模块——“调度器”,它的实现方式类似于“随机调度”的效果

(2)“抢占式执行”

一个线程什么时候被调度到cpu上执行是不确定的

一个线程什么时候从cpu上下来,也是不确定的

这在我前面写过的文章cpu的调度有提及,线程的安全性问题,当前主流的操作系统都是“抢占式执行”

(3)打印结果分析:

可以看出先打印run的次数是比较多的。在前面我们学过,线程的引入是为了解决“进程频繁创建和销毁带来的资源浪费”这一问题的,同一个进程中,有第一个线程创建后,后面的线程创建所耗费的资源就会大大降低。

这里同样是如此,main函数作为这个进程中的主线程,第一个创建所耗费的资源是最多的,但是也是最先被打印的,后续while循环中,run第一次出现的次数才更多的

注:线程的创建也是需要耗费资源的,第一个线程最大,后续的比较少,但不是没有

2:jconsole工具

查看线程信息的工具

代码出问题可以在这查看

3:sleep方法

(1)我们引入while循环达到多次实验的目次,sleep方法是为了避免打印过快而引入的

(2)C语言中是大写的Sleep,JAVA中对其进行了封装,所以我们用的是.sleep(),括号中是填毫秒数

(3)在写sleep方法时会报异常:这是一个受查异常,必须要捕捉,有两种捕捉方式——try catch      /  throw

(interrupted)被打断

在sleep1000ms这个过程中,可能会被打断,就会报异常

4:异常捕获

在main方法中既可以使用try catch 也可以使用 throw ,但是run方法中只能使用try catch这是为什么呢?

重写的run方法为子类方法,因为父类run方法并没有抛throw异常,那子类也不能写,只能是保留@Override这个标签

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

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

相关文章

【25.6】C++智能交友系统

常见错误总结 const-1 如下代码会报错 原因如下&#xff1a; man是一个const修饰的对象&#xff0c;即man不能修改任何内容&#xff0c;但是man所调用的play函数只是一个普通的函数&#xff0c;所以出现了报错。我们需要在play函数中加上const修饰&#xff0c;或者删除man对…

创建一个Java项目在IntelliJ IDEA中

创建一个Java项目在IntelliJ IDEA中是一个直观且功能强大的过程&#xff0c;适合从初学者到经验丰富的开发者。IntelliJ IDEA由JetBrains开发&#xff0c;被誉为Java开发领域最受欢迎的IDE&#xff08;集成开发环境&#xff09;之一&#xff0c;它提供了代码自动补全、版本控制…

【计算机网络 - 基础问题】每日 3 题(十八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

SpringBoot环境配置(Spring Boot Profile)

一、介绍 在Spring Boot中&#xff0c;spring.profiles 配置用于定义不同环境下的配置文件。这使得应用可以在不同的环境中使用不同的配置&#xff0c;比如开发环境、测试环境和生产环境等。这种方式可以避免在代码中硬编码配置信息&#xff0c;并且能够更灵活地管理应用的环境…

SpringBootWeb增删改查入门案例

前言 为了快速入门一个SpringBootWeb项目&#xff0c;这里就将基础的增删改查的案例进行总结&#xff0c;作为对SpringBootMybatis的基础用法的一个巩固。 准备工作 需求说明 对员工表进行增删改查操作环境搭建 准备数据表 -- 员工管理(带约束) create table emp (id int …

计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

选题背景‌&#xff1a; 随着城市化进程的加快&#xff0c;公共交通成为城市居民出行的重要方式。然而&#xff0c;传统的公交站点线路查询方式往往依赖于纸质地图或简单的电子显示屏&#xff0c;查询效率低下且信息更新不及时。因此&#xff0c;开发一个功能全面、易于使用的…

OpenMV学习第一步安装IDE_2024.09.20

用360浏览器访问星瞳科技官网&#xff0c;一直提示访问不了。后面换了IE浏览器就可以访问。第一个坑。

互联网技术的持续演进:从现在到未来

互联网技术的持续演进&#xff1a;从现在到未来 在过去的十年里&#xff0c;互联网技术发生了飞速变化。无论是大数据、人工智能&#xff0c;还是5G网络和物联网&#xff0c;每一种技术的突破都在改变我们的生活方式和工作模式。作为现代社会的核心驱动力&#xff0c;互联网技…

Qwen2-VL的微调及量化

一、Qwen2-VL简介 Qwen2-VL是Qwen-VL的升级版本&#xff0c;能力更强&#xff0c;性能全面提升。尤其是72B参数的版本更是取了惊人的成绩。它可以读懂不同分辨率和不同长宽比的图片&#xff0c;在 MathVista、DocVQA、RealWorldQA、MTVQA 等基准测试创下全球领先的表现&#xf…

基于springboot的智慧社区微信小程序

文未可获取一份本项目的java源码和数据库参考。 本课题研究目标 本文主要对小区生活服务平台的功能和非功能需求进行了分析&#xff0c;系统除了提供物业保修、小区资讯、投诉留言、常用电话等基础功能外&#xff0c;为了满足用户的多样化需求&#xff0c;还提供邻里圈子和有…

238 除自身以外数组的乘积

解题思路&#xff1a; \qquad 这道题要求在 O ( n ) O(n) O(n) 时间内解决&#xff0c;但是不能使用除法。仅使用乘法的话&#xff0c;看上去很难在一次遍历中得出想要的结果&#xff0c;但是没关系&#xff0c;一次遍历不行的话那就试试两次、三次&#xff0c;重要的是分析在…

Python--TCP/UDP通信

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.客户端与服务端通信原理 1. 服务器端 服务器端的主要任务是监听来自客户端的连接请求&#xff0c;并与之建立连接&#xff0c;然后接收和发送数据。 创建套接字&#xff1a;首先&#xff0…

从零开始学习Linux(13)---多线程

目录 1.线程 1.线程的概念 2.线程的理解&#xff08;Linux系统为例&#xff09;---一般系统 3.进程vs线程 4.线程的控制 5.线程的等待 6.线程的终止 7.线程的分离 2.线程的互斥 1.互斥锁 2.条件变量 3.生产消费模型 4.阻塞队列 5.信号量 6.唤醒队列 1.线程 1.线…

【数据库】常用数据库简介

目录 &#x1f354; 常用的关系型数据库 &#x1f354; Mysql简介 &#x1f354; SQL 简介 SQL语句的分类 SQL 写法 SQL 常用的数据类型 &#x1f354; DDL语句 对数据库的操作 对数据表的操作 &#x1f354; DML语句 插入数据 insert into 修改数据 update 删除数…

css基础知识笔记

一言&#xff1a; “放任误解就是撒谎。” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;CSS基础教程0.文本样式基础1. CSS选择器2. CSS布局技巧3. 响应式设计4. Emmet语法 总结 前言 写在开始&#xff1a; 今天来看一眼CSS基础知识。 好几天没更新了 先更一篇 文章有…

C++如何进阶? -- 整理一些学习资料

在学习完C最基础的知识后&#xff0c;需要对C有更近一步的认知&#xff0c;才能在实际编程中写出更高效更清晰的代码。 看门见山&#xff0c;首先贴出学习资料&#xff1a; 书籍&#xff1a; STL源码剖析(必看)Effective C(必看)More Effective C(选看)深度探索C对象模型(选…

Java操控Redis (面经之 使用Redis)

操控Redis的工具 ReactiveRedisTemplate 和 RedisTemplate : RedisTemplate&#xff1a; 它是一个通用的模板类&#xff0c;可以使用任何序列化策略来序列化和反序列化键和值。默认情况下&#xff0c;它使用 JdkSerializationRedisSerializer 序列化值&#xff0c;并使用 Strin…

DataGrip在Windows和MacOS平台上的快捷键

0. 背景信息 No.说明1测试DataGrip版本号 : 2024.2.2 1. Windows下快捷键 2. MacOS下快捷键

【Kubernetes】常见面试题汇总(二十三)

目录 69.考虑一家拥有分布式系统的跨国公司&#xff0c;拥有大量数据中心&#xff0c;虚拟机和许多从事各种任务的员工。您认为这样公司如何以与 Kubernetes 一致的方式管理所有任务&#xff1f; 70.考虑一种情况&#xff0c;即公司希望通过维持最低成本来提高其效率和技术运营…

Java流程控制语句——跳转语句详解:break 与 continue 有什么区别?

&#x1f310;在Java编程中&#xff0c;break和continue是两个重要的控制流语句&#xff0c;它们允许开发者根据特定条件改变程序的执行流程。虽然两者都用于中断当前的行为&#xff0c;但它们的作用方式不同。本文将通过生动的例子来详细解释这两个语句&#xff0c;并使用流程…