多线程入门

文章目录

  • 多线程相关的概念
  • 什么是多线程
  • 多线程的创建方式
    • 继承Thread方式
    • 实现Runable方式
    • 两种方式比较
    • Thread类中常用方法


在这里插入图片描述

多线程相关的概念

  • 并发与并行
    • 并行:在同一时刻,有多个任务在多个CPU上同时执行。
    • 并发:在同一时刻,有多个任务在单个CPU上交替执行。
  • 进程与线程
    • 进程:就是操作系统中正在运行的一个应用程序。
    • 线程:就是应用程序中做的事情。比如:360软件中的杀毒,扫描木马,清理垃圾。

什么是多线程

  • 是指从软件或者硬件上实现多个线程并发执行的技术。
    具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。
  • 好处 : 提高任务的执行性能

多线程的创建方式

继承Thread方式

基本步骤:

  • 创建一个类继承 Thread 类。
  • 在类中重写run方法(线程执行的任务放在这里)
  • 创建线程对象,调用线程的start方法开启线程。
  • 执行程序,观察控制台的打印数据的现象
/*线程的创建方式1:继承Thread方式基本步骤 :1 创建一个类继承Thread类。2 在类中重写run方法(线程执行的任务放在这里)3 创建线程对象,调用线程的start方法开启线程。需求 :我们启动一个Java程序,其实默认就存在一个主线程(main方法所在线程)接下来,我们在主线程启动一个线程,打印1到100的数字,主线程启动完线程后又打印1到100的数字。此时主线程和启动的线程在并发执行,观察控制台打印的结果。*/
public class MyThread01 {public static void main(String[] args) {// 创建线程对象,调用线程的start方法开启线程。MyThread mt = new MyThread();mt.start();// main方法中的任务for (int i = 1; i <= 100; i++) {System.out.println("i:" + i);}}
}
// 创建一个类继承Thread类。
class MyThread extends Thread {// 在类中重写run方法(线程执行的任务放在这里)@Overridepublic void run() {for (int i = 1; i <= 100; i++) {System.out.println("i:" + i);}}
}

实现Runable方式

  • 构造方法

    • public Thread(Runnable target)
    • public Thread(Runnalbe target , String name)
  • 实现步骤

    • 定义任务类实现Runnable,并重写run方法
    • 创建任务对象
    • 使用含有Runnable参数的构造方法,创建线程对象并指定任务。
    • 调用线程的start方法,开启线程
/*线程的创建方式2:实现Runnable方式基本步骤 :1 定义任务类实现Runnable,并重写run方法2 创建任务对象3 使用含有Runnable参数的构造方法,创建线程对象并指定任务。4 调用线程的start方法,开启线程需求 :我们启动一个Java程序,其实默认就存在一个主线程(main方法所在线程)接下来,我们在主线程启动一个线程,打印1到100的数字,主线程启动完线程后又打印1到100的数字。此时主线程和启动的线程在并发执行,观察控制台打印的结果。*/
public class MyThread02 {public static void main(String[] args) {// 创建线程对象,调用线程的start方法开启线程。MyRunnable mr = new MyRunnable();Thread thread= new Thread(mr);thread.start();// main方法中的任务for (int i = 1; i <= 100; i++) {System.out.println("i:" + i);}}}// 1 定义任务类实现Runnable,并重写run方法
class MyRunnable implements Runnable {// 在类中重写run方法(线程执行的任务放在这里)@Overridepublic void run() {for (int i = 1; i <= 100; i++) {System.out.println("i:" + i);}}
}

两种方式比较

实现方式优点缺点
实现 Runnable扩展性强
实现接口的同时还可以继承其他的类
编程相对复杂
不能直接使用Thread中的方法
继承 Thread编程比较简单
可以直接使用Thread中的方法
可扩展性差
不能再继承其他的类

Thread类中常用方法

  • String getName():返回此线程的名称

  • Thread类中设置线程的名字

    • void setName(String name):将此线程的名称更改为等于参数 name
    • 通过构造方法也可以设置线程名称
  • public static Thread currentThread():返回对当前正在执行的线程对象的引用

  • public static void sleep(long time):让线程休眠指定的时间,单位为毫秒

  • public final synchronized void join(long millis):

当在使用多线程编程时,可能会创建多个线程来同时执行不同的任务。join 方法是一个用来管理线程执行顺序的重要工具。

当一个线程调用另一个线程的 join 方法时,它会等待被调用线程执行完成,然后再继续执行。换句话说,调用了 join
方法的线程会在被调用线程完成后才会结束。

这对于需要确保某些线程在其他线程执行完毕后再执行的情况非常有用。例如,如果你有一个主线程和两个子线程,主线程需要等待两个子线程都完成后再做某些处理,你就可以在主线程中调用两个子线程的
join 方法,这样主线程就会等待两个子线程都执行完毕后再继续执行。
需要注意的是,如果你不使用 join 方法,主线程和子线程可能会同时执行,这可能会导致竞争条件或其他问题。所以,在多线程编程中,合理地使用 join
方法可以确保线程的执行顺序和逻辑正确性。

  • 线程有两种调度模型

    • 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
    • 抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
    /*线程有两种调度模型1 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片2 抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些注意 : Java使用的是抢占式调度模型优先级高 , 只是抢夺到cpu执行的概率高而已 , 只是一种概率问题*/
    public class PriorityDemo {public static void main(String[] args) {Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {System.out.println(Thread.currentThread().getName() + ":" + i);}}});// 优先级最低thread1.setPriority(1);thread1.start();Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {System.out.println(Thread.currentThread().getName() + ":" + i);}}});// 优先级最高thread2.setPriority(10);thread2.start();}
    }
    




在这里插入图片描述



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

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

相关文章

[网鼎杯 2020 玄武组]SSRFMe

[网鼎杯 2020 玄武组]SSRFMe 源码 <?php function check_inner_ip($url) {$match_resultpreg_match(/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/,$url);if (!$match_result){die(url fomat error);}try{$url_parseparse_url($url);}catch(Exception $e){die(url foma…

Linux内核

一、 内核开发与逻辑开发对比 内核开发&#xff1a; 需要应用程序调用API去在操作系统里对硬件进行操作。操作系统不允许用户直接去通过置GPIO口1或者0去控制硬件&#xff0c;为了管理这一切。操作系统将整个开发中分成了两个空间&#xff0c;一个是用户空间&#xff08;上两…

HarmonyOS 开发-Navigation页面跳转对象传递案例

介绍 本示例主要介绍在使用Navigation实现页面跳转时&#xff0c;如何在跳转页面得到转入页面传的类对象的方法。实现过程中使用了第三方插件class-transformer&#xff0c;传递对象经过该插件的plainToClass方法转换后可以直接调用对象的方法&#xff0c; 效果图预览 使用说…

YOLOv9改进策略 :小目标 | 新颖的多尺度前馈网络(MSFN) | 2024年4月最新成果

💡💡💡本文独家改进:多尺度前馈网络(MSFN),通过提取不同尺度的特征来增强特征提取能力,2024年最新的改进思路 💡💡💡创新点:多尺度前馈网络创新十足,抢先使用 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特征的提取能力;2)放在detect…

蝙蝠优化算法(bat optimization algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 蝙蝠优化算法&#xff08;Bat Algorithm&#xff09;是一种基于群体智能的优化算法&#xff0c;它的灵感来源于蝙蝠捕食时的回声定位行…

Linux(Ubuntu)中创建【samba】服务,用于和Windows系统之间共享文件

目录 1.先介绍一下什么是Samba 2.安装&#xff0c;配置服务 安装 配置&#xff08;smb.conf&#xff09; 配置用户 3.出现的问题&#xff08;Failed to add entry for user XXXX&#xff09; 4.创建文件夹 5.windows访问 6.其他 Samba【服务状态】查看 Samba服务启动…

Training - Kubeflow 的 PyTorchJob 配置 DDP 分布式训练 (ncclInternalError)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137569332 Kubeflow 的 PyTorchJob 是 Kubernetes 自定义资源&#xff0c;用于在 Kubernetes 上运行 PyTorch 训练任务&#xff0c;是 K…

网格矢量如何计算莫兰指数

网格矢量如何计算莫兰指数 引言 遇到一个问题&#xff0c;计算矢量网格的莫兰指数。 概念解释 莫兰指数 莫兰指数&#xff08;Moran’s Index&#xff09;是一种空间自相关指标&#xff0c;用于衡量空间数据的相似性和聚集程度。它可以用来描述一个区域与其邻近区域之间的属…

这4大流氓软件,以后看见记得绕着走。

第一个&#xff0c;2345浏览器。时不时弹出广告&#xff0c;还会自动修改你的默认主页&#xff0c;并且很难修改回去。 第二个&#xff0c;搜狗输入法。别以为它打字很方便&#xff0c;实际上弹广告也很方便。 第三个&#xff0c;快压。解压不仅给你弹广告&#xff0c;还能让…

TCP-IP详解卷一:协议——阅读总结

该内容适合程序员查看 第1章 概述 1.1 引言 WAN全称是 Wide Area Network&#xff0c;中文名为广域网。 LAN全称是 Local Area Network&#xff0c;中文名为局域网。 1.2分层 ICP/IP协议族通常被认为是一个四层协议系统 分层协议应用层Telnet、FTP和e-mail运输层TCP和UDP网…

EVAL-21489-EZLITE原理图下载方法

1&#xff0c;进入官网&#xff0c;搜索“21489”&#xff1a; 2&#xff0c;下拉找到EVAL-21489-EZLITE&#xff0c;点击“文件”&#xff1a; 3&#xff0c;点击“电路板设计数据库”的“查看全部”&#xff1a; 4&#xff0c;点击下载即可&#xff1a; 5&#xff0c;下载完成…

Python 全栈体系【四阶】(二十五)

第五章 深度学习 二、计算机视觉基本理论 11. 图像梯度处理 11.1 什么是图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯度值也较大&#xff1b;相反&#xff0c;对于图像中比较平滑的部分&#xff0c;其灰度值变化…

【鸿蒙开发】ArkTS和组件

1. 初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性。 当前&#xff0c;ArkTS在TS的基础上主要扩展了如下能力&#xff1a; 基本语法&#xff1a;ArkTS定义了声明式UI描述、自…

一招搞定vcruntime140_1.dll无法继续执行代码的解决方法

在我们日常频繁地与计算机互动、依赖其高效处理各类任务的过程中&#xff0c;偶尔会遭遇一些突发的技术问题&#xff0c;导致原本顺畅的操作流程被迫中断。其中一种常见的困扰便是系统弹出一则明确且令人颇感困惑的错误提示&#xff1a;“由于找不到vcruntime140_1.dll文件&…

C语言的显式类型转换和隐式类型转换详细讲解

目录 一、类型转换 1、显式类型转换 2、隐式类型转换 二、算术转换 三、总结 每个编译器都会对表达式做两件事情&#xff0c;一是判断表达式中操作符的优先级和结合性&#xff0c;二是判断表达式中的操作数类型是否一致&#xff0c;如果不一致则需要进行类型转换。第一点在…

机器学习(五) -- 监督学习(2) -- k近邻

系列文章目录及链接 目录 前言 一、K近邻通俗理解及定义 二、原理理解及公式 1、距离度量 四、接口实现 1、鸢尾花数据集介绍 2、API 3、流程 3.1、获取数据 3.2、数据预处理 3.3、特征工程 3.4、knn模型训练 3.5、模型评估 3.6、结果预测 4、超参数搜索-网格搜…

相机模型浅析

相机模型 文章目录 相机模型四个坐标系针孔相机模型世界坐标系到相机坐标系相机坐标系到图像坐标系图像坐标到像素坐标 四个坐标系 ①世界坐标系&#xff1a;是客观三维世界的绝对坐标系&#xff0c;也称客观坐标系。因为数码相机安放在三维空间中&#xff0c;我们需要世界坐标…

Python3 replace()函数使用详解:字符串的艺术转换

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

JavaScript(1)神秘的编程技巧

大家都感兴趣的箭头函数 箭头函数在许多场景中都可以发挥作用&#xff0c;尤其适用于简化函数声明和提高代码的可读性。以下是箭头函数可以使用的一些常见方面&#xff1a; &#xff08;1&#xff09;回调函数&#xff1a; 箭头函数特别适合作为回调函数&#xff0c;例如在事…

RuntimeError: Library cublas64_12.dll is not found or cannot be loaded

运行guillaumekln/faster-whisper-large-v2模型进行语音识别的时候报错了 RuntimeError: Library cublas64_12.dll is not found or cannot be loaded 代码&#xff1a; from faster_whisper import WhisperModelmodel WhisperModel("H:\\model\\guillaumekln\\faster…