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

news2024/12/31 5:03:56

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

目录

引入:

一: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这个标签

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

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

相关文章

SpringBoot+thymeleaf竞赛报名系统

一、介绍 > 这是一个基于Spring Boot的后台管理系统。 > 使用了Mybatis Plus作为持久层框架&#xff0c;EasyExcel用于Excel操作&#xff0c;Thymeleaf作为前端模板引擎。 > 界面简洁&#xff0c;功能丰富&#xff0c;完成度比较高&#xff0c;适用于JAVA初学者作…

安国U盘量产工具系列下载地址

来源地址&#xff08;访问需要科学工具&#xff09;&#xff1a;AlcorMP (Последняя версия ALCOR U2 MP v23.08.07.00.H) – [USBDev.ru] 版本列表&#xff1a; AlcorMP&#xff08;最新版本的 ALCOR U2 MP v23.08.07.00.H&#xff09; AlcorMP是在Alcor Mic…

SpringBoot项目License证书生成与验证(TrueLicense) 【记录】

SpringBoot项目License证书生成与验证(TrueLicense) 【记录】 在非开源产品、商业软件、收费软件等系统的使用上&#xff0c;需要考虑系统的使用版权问题&#xff0c;不能随便一个人拿去在任何环境都能用。应用部署一般分为两种情况&#xff1a; 应用部署在开发者自己的云服务…

数据集-目标检测系列-火车检测数据集 train >> DataBall

数据集-目标检测系列-火车检测数据集 train >> DataBall 数据集-目标检测系列-火车检测数据集 数据量&#xff1a;1W 想要进一步了解&#xff0c;请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;不断增加…

跟李沐学AI:注意力机制、注意力分数

目录 不随意线索 随意线索 注意力机制 非参注意力池化层 参数化的注意力机制 注意力机制总结 注意力分数 拓展到高维度 加性模型&#xff08;Additive Attention&#xff09; 点积注意力机制&#xff08;Dot Product Attention&#xff09; 注意力分数总结 不随意线…

vscode 顶部 Command Center,minimap

目录 vscode 顶部 Command Center 设置显示步骤: minimap设置 方法一:使用设置界面 方法二:使用命令面板 方法三:编辑 settings.json 文件 左侧目录树和编辑器字体不一致: vscode 顶部 Command Center Visual Studio Code (VSCode) 中的 Command Center 是一个集中…

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…

Python redis 安装和使用介绍

python redis安装和使用 一、Redis 安装1.1、Windows安装 二、安装 redis 模块二、使用redis 实例1.1、简单使用1.2、连接池1.3、redis 基本命令 String1.3.1、ex - 过期时间&#xff08;秒&#xff09;1.3.2、nx - 如果设置为True&#xff0c;则只有name不存在时&#xff0c;当…

fiddler抓包08_抓Android手机请求

课程大纲 手机抓包&#xff0c;电脑端的设置和IOS端相同&#xff0c;设置一次即可&#xff0c;无需重复设置。 前提&#xff1a;电脑和手机连接同一个局域网 土小帽电脑和手机都连了自己的无线网“tuxiaomao”。 Step1. 电脑端设置 ① 打开Fiddler - 开启抓包&#xff08;F12…

django项目——图片上传到阿里云OSS对象存储

文章目录 实现图片上传到阿里云OSS对象存储1. 创建阿里云OSS对象存储2. 查询获取接口访问key和秘钥3. 安装阿里云的SDK集成到项目中使用3.1 python直接操作oss23.2 django配置自定义文件存储上传文件到oss 实现图片上传到阿里云OSS对象存储 1. 创建阿里云OSS对象存储 开发文档…

重磅!人工智能等级考试来了,考试免费,上海落户可以加分

目录 简要介绍 一、关心的问题 1. 什么是上海市高等学校信息技术水平考试&#xff1f; 2. 考试分几个级别&#xff1f;有哪些科目&#xff1f; 3. 哪些人可以进行报名&#xff1f; 4. 每名学生可以报考几个科目&#xff1f; 5. 有没有考试大纲&#xff1f; 6. 考试是否有…

[笔记]23年度展会信息— 吊钩 起升机构

1.吊钩的规格参数 5吨吊钩重26公斤 10吨64公斤。 另外一套型号&#xff0c;更轻&#xff1a; 不确定是结构设计还是用钢材质达到了减重效果。 看看重载双滑轮吊钩&#xff1a; 50吨&#xff0c;400公斤&#xff0c;只是吊钩。 然后是行车吊钩与钢丝绳的直径。这在计算空载吊…

Web Components之继承

我们在使用Web Components自定义组件的时候&#xff0c;我们需要继承HTMLElement这个浏览器内置对象&#xff0c;但是如果我要一些高级封装&#xff0c;给组件内置一些方法的话。我们就需要使用继承的方式&#xff0c;在父类中实现基本功能的封装。 1 父类的封装 以下是我的继…

一文搞懂UEFI

Hi&#xff01;早哦。今天又是宠读者的一天&#xff0c;应允聊聊UEFI。 文章目录 前言UEFI是什么&#xff1f;传统BIOSBIOS作为标准BIOS作为实现BIOS的工作原理传统BIOS的局限性传统BIOS启动过程 BIOS VS UEFIUEFI&#xff1f;UEFI概念EFI 系统分区EFI 变量EFI 的启动过程EFI 变…

【高分系列卫星简介——高分三号卫星(GF-3)】

高分三号卫星&#xff08;GF-3&#xff09; 高分三号&#xff08;GF-3&#xff09;是我国首颗高分辨率、C频段、多极化合成孔径雷达&#xff08;SAR&#xff09;卫星&#xff0c;由中国空间技术研究院北京空间飞行器总部设计部研制&#xff0c;并于2016年8月10日成功发射。该卫…

thop计算模型复杂度(params,flops)

thop安装 -pip install thop在线安装失败 -离线安装 github网址&#xff1a; pytorch-OpCounter:Count the MACs / FLOPs of your PyTorch model. - GitCode python setup.py install 测试&#xff1a; from options import config as c import os os.environ["CUD…

【Flink实战】flink消费http数据并将数组展开多行

文章目录 一. 需求描述二. 方案思路1. 解决思路2. flink json 解析2.1. 通过json path解析非array数据2.2. 通过json path解析array数据 3. CROSS JOIN逻辑 三. 方案实现1. http json数据样例2. flink sql 说明 一. 需求描述 flink消费http接口的数据&#xff0c;将json中的数…

【JavaEE初阶】多线程7(面试要点)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 常见的锁策略 乐观锁vs悲观锁 重量级锁vs轻量级锁 挂起等待锁vs自旋锁 公平锁vs非公平锁 可重入锁vs不可重入锁 读写锁 synchronized的加锁过程 锁升级的过程 偏向锁 …

博途TIA v18下载时,需要重启才能安装下载路径是灰色改不了

一、需要重启才能安装 删除下面注册表P开头的文件&#xff1a; 二、下载路径是灰色改不了 注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion里找到C:\Program Files或者C:\Program Files&#xff08;x86&#xff09;&#xff0c;具体哪个看安装的时候对应…

【面向对象】设计原则

单一职责&#xff1a;低耦合&#xff0c;高内聚。一个类不要负责太多的功能&#xff0c;否则会导致类内部耦合度高&#xff0c;不利于扩展&#xff1b;开闭原则&#xff1a;对扩展开放&#xff0c;对修改关闭。扩展新功能时&#xff0c;不建议修改原有的代码&#xff0c;建议通…