【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{
    @Override
    public 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{
    @Override
    public 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这个标签

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot每次都需要重设密码?明明在springboot的配置中设置了密码

第一步&#xff1a;查看当前的密码是什么&#xff1f; 打开redis-cli.exe&#xff0c;输入config get requirepass&#xff0c;查看当前的密码是什么&#xff1f; 接着&#xff0c;修改redis的配置文件&#xff0c;找到redis的安装目录&#xff0c;找到相关的conf文件&#x…

FreeRTOS下UART的封装

FreeRTOS下UART的封装_哔哩哔哩_bilibili Git使用的一个BUG&#xff1a; 当出现这个问题是因为git本身的安全证书路径有问题&#xff0c;我们需要重新指定路径 P1:UART程序层次

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义&#xff1a;css2.颜色&#xff1a;color3.字体相关属性&#xff1a;font3.1.字体大小&#xff1a;font-size3.2.字体风格&#xff1a;font - style3.3.字体粗细&#xff1a;font - weight3.4.字体族&#xff1a;font - family 4.位置&#xff1a;text-align 1.…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时&#xff0c;移除Dockershim后存在哪些疑惑&#xff1f; 大家好&#xff0c;我是秋意零。 K8s版本截止目前&#xff08;24/09&#xff09;已经发布到了1.31.x版本。早在K8s版本从1.24.x起&#xff08;22/05&#xff09;&#xff0c;默认的容器运行时就不再是Doc…

最新Kali Linux超详细安装教程(附镜像包)

一、镜像下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BfiyAMW6E1u9fhfyv8oH5Q 提取码&#xff1a;tft5 二、配置虚拟机 这里我们以最新的vm17.5为例。进行配置 1.创建新的虚拟机&#xff1a;选择自定义 2.下一步 3.选择稍后安装操作系统 4.选择Debian版本 因…

02_RabbitMQ消息丢失解决方案及死信队列

一、数据丢失 第一种&#xff1a;生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候&#xff0c;可能数据就在半路给搞丢了&#xff0c;因为网络问题&#xff0c;都有可能。 第二种&#xff1a;RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了。 第三种&#xff1a;消费端…

Vue3新组件transition(动画过渡)

transition组件&#xff1a;控制V-if与V-show的显示与隐藏动画 1.基本使用 <template><div><button click"falg !falg">切换</button><transition name"fade" :enter-to-class"etc"><div v-if"falg&quo…

为什么git有些commit记录,只有git reflog可以看到,git log看不到?

文章目录 原因分析1. git log 只能显示 **可达的** 提交2. git reflog 记录所有引用的变更 常见导致 git log 看不到提交的原因1. git reset 操作2. git rebase 操作3. 分支删除4. git commit --amend5. 垃圾回收&#xff08;GC&#xff09;* 如何恢复 git log 看不到的提交&am…

数据库系统基础概述

文章目录 前言一、数据库基础概念 1.数据库系统的组成2.数据模型3.数据库的体系结构二、MySQL数据库 1.了解MySQL2.MySQL的特性3.MySQL的应用场景总结 前言 MySQL数据库是一款完全免费的产品&#xff0c;用户可以直接从网上下载使用&#xff0c;不用花费任何费用。这点对于初学…

多语言长文本 AI 关键字提取 API 数据接口

多语言长文本 AI 关键字提取 API 数据接口 AI / 文本 专有模型极速提取 多语言长文本 / 实时语料库。 1. 产品功能 支持长文本关键词提取&#xff1b;多语言关键词识别&#xff1b;基于 AI 模型&#xff0c;提取精准关键词&#xff1b;全接口支持 HTTPS&#xff08;TLS v1.0 …

CentOS7更换阿里云yum更新源

目前CentOS内置的更新安装源经常报错无法更新&#xff0c;或者速度不够理想&#xff0c;这个时候更换国内的镜像源就是一个不错的选择。 备份内置更新源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载阿里云repo源&#xff08;需要系统…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0916)

接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径&#xff1a; http://big-event-vue-api-t.itheima.net 本项目的技术栈 本项目技术栈基于 ES6、vue3、pinia、vue-router 、vite 、axios 和 element-plus http:/…

LeetCode 每周算法 6(图论、回溯)

LeetCode 每周算法 6&#xff08;图论、回溯&#xff09; 图论算法&#xff1a; class Solution: def dfs(self, grid: List[List[str]], r: int, c: int) -> None: """ 深度优先搜索函数&#xff0c;用于遍历并标记与当前位置(r, c)相连的所有陆地&…

HTML讲解(二)head部分

目录 1. 2.的使用 2.1 charset 2.2 name 2.2.1 describe关键字 2.2.2 keywords关键字 2.2.3 author关键字 2.2.4 http-equiv 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#x…

暴力枚举算法

《啊哈&#xff01;算法》学习笔记 本博客的题目仅用暴力枚举&#xff0c;并不一定是最好的解法&#xff0c;主要是了解枚举算法 例题一&#xff1a;两方框奥数 在两个方框内填入相同的数字使得等式成立&#xff1a; 代码如下&#xff1a; for(i1;i<9;i) {if((i*103)*652…

yolov8模型在Xray图像中关键点检测识别中的应用【代码+数据集+python环境+GUI系统】

yolov8模型在X yolov8模型在Xray图像中关键点检测识别中的应用【代码数据集python环境GUI系统】 1.背景意义 X射线是一种波长极短、穿透能力极强的电磁波。当X射线穿透物体时&#xff0c;不同密度和厚度的物质会吸收不同程度的X射线&#xff0c;从而在接收端产生不同强度的信号…

Python办公自动化教程(003):PDF的加密

【1】代码 from PyPDF2 import PdfReader, PdfWriter# 读取PDF文件 pdf_reader PdfReader(./file/Python教程_1.pdf) pdf_writer PdfWriter()# 对第1页进行加密 page pdf_reader.pages[0]pdf_writer.add_page(page) # 设置密码 pdf_writer.encrypt(3535)with open(./file/P…

Google 扩展 Chrome 安全和隐私功能

过去一周&#xff0c;谷歌一直在推出新特性和功能&#xff0c;旨在让用户在 Chrome 上的桌面体验更加安全&#xff0c;最新的举措是扩展在多个设备上保存密钥的功能。 到目前为止&#xff0c;Chrome 网络用户只能将密钥保存到 Android 上的 Google 密码管理器&#xff0c;然后…

240912-设置WSL中的Ollama可在局域网访问

A. 最终效果 B. 设置Ollama&#xff08;前提&#xff09; sudo vim /etc/systemd/system/ollama.service[Unit] DescriptionOllama Service Afternetwork-online.target[Service] ExecStart/usr/bin/ollama serve Userollama Groupollama Restartalways RestartSec3 Environme…

基于SpringBoot+Vue的时尚美妆电商网站系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目源码、Python精…