Java零基础之多线程篇:线程的多种创建方式

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  众所周知,多线程是现代计算机应用程序设计中的重要概念之一,尤其是在项目开发中,经常有场景会被使用到。其实它非常容易理解,它允许程序同时执行多个任务,从而提高了系统的资源利用率和响应速度。在本文中,我们将深入研究多线程的概念、本质、作用以及多种创建方式,并通过具体的Java代码测试用例来加深对多线程的理解。

摘要

  本文通过对多线程的概念进行介绍,我会解释多线程在现代计算机应用程序中的作用和优势。然后,我们比较了使用Runnable接口和Thread类来创建线程的两种方式,并分析了它们之间的区别。接下来,我们讨论了线程的生命周期以及Java中控制线程的方法。然后,我们介绍了sleep()方法和yield()方法,并比较了它们之间的区别。此外,我们还比较了sleep()方法和wait()方法的区别,并讨论了线程安全问题。最后,我们介绍了同步代码块和同步方法,并讨论了何时会释放对同步监视器锁定以及同步锁和死锁的概念。

简介

  不言而喻,我们都知道,多线程是有着一种同时执行多个任务的能力,它允许程序在同一时间内执行多个线程。通过使用多线程,我们可以提高系统的资源利用率和响应速度。例如,在图像处理应用程序中,我们可以将图像加载和图像处理分为两个线程并行执行,从而提高图像处理的速度。

  在Java开发语言中,我们可以使用Runnable接口或Thread类来创建和管理线程,虽然还有很多创建线程的方式,这里就不一一赘述啦。使用Runnable接口创建线程的方式更加灵活,因为一个类可以实现多个接口,从而允许多个线程同时执行不同的任务。而使用Thread类创建线程的方式更加简单,因为它只需要继承Thread类并重写run()方法即可。

源代码解析

下面是一个使用Runnable接口创建线程的示例代码:

1、创建线程;示例代码如下,仅供参考:

/*** @Author ms* @Date 2024-04-12 18:27*/
public class MyRunnable implements Runnable {public void run() {// 线程执行的代码System.out.println("线程执行啦!");}
}

2、启动线程;示例代码如下,仅供参考:

/*** @Author ms* @Date 2024-04-12 18:27*/
public class ThreadDemo {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();}
}

  上述代码中,MyRunnable类实现了Runnable接口,并重写了run()方法,这就算创建了一个多线程。然后,在ThreadDemo类中,我们创建了一个MyRunnable对象,并将其作为参数传递给Thread类的构造方法。最后,我们调用start()方法启动线程。

  我们执行下main函数,我们可以看看,控制台的输出内容,是否与预期的一样?


  在这个示例中,当thread.start()被调用时,JVM会在内部创建一个新的线程,并在这个新线程中执行MyRunnable的run()方法,正常执行了线程方法,输出了打印内容。同时,主线程还会继续执行start()方法之后的代码,比如如下拓展。

        // 启动线程thread.start();// 主线程中也可以执行其他操作System.out.println("主线程在运行...");

  这样,主线程和新创建的线程可以并行运行。

应用场景案例

  这里,我们再来谈谈多线程在现代计算机应用程序中有广泛的应用场景。下面是一些常见的应用场景案例:

  1. 网络服务器:在网络服务器中,多线程能够同时处理多个请求,提高服务器的性能和响应速度。

  2. 并发编程:在并发编程中,多线程能够同时执行多个任务,加快处理速度。

  3. 图形图像处理:在图形图像处理应用程序中,多线程能够同时加载和处理多个图像,提高图像处理速度。

  4. 数据库操作:在数据库操作中,多线程能够同时执行多个查询和更新操作,提高数据库的性能和响应速度。

  虽然还有很多适用场景,这里我们就简单讲述了下,更多的还得靠大家去挖掘去发现。

优缺点分析

  同时,在使用多线程是,它有很多优点,也存在一些缺点。

优点:

  1. 提高系统的资源利用率和响应速度。

  2. 允许程序同时执行多个任务,提高程序的性能。

缺点:

  1. 线程之间共享内存,可能会导致数据不一致或线程安全问题。

  2. 线程的创建和销毁需要消耗系统资源。

  3. 可能会导致死锁等并发问题。

类代码方法介绍

  在Java中,Thread类提供了许多方法来创建和管理线程。下面是一些常用的方法介绍,基础也得巩固好,大家请看:

  1. start()方法:启动线程,并调用run()方法。

  2. run()方法:线程的执行代码。

  3. sleep()方法:暂停当前线程的执行,让出CPU的使用权。

  4. yield()方法:暂停当前线程的执行,让出CPU的使用权,但不会阻塞线程。

  5. join()方法:等待另一个线程执行完成后再继续执行。

  6. interrupt()方法:中断线程的执行。

  7. isAlive()方法:判断线程是否还在执行中。

测试用例

  下面是一个使用Thread类创建线程及如何启动线程的示例代码,希望能够带大家熟悉并掌握多线程的基础。

1、先创建一个MyRunnable类实现Runnable接口的run方法,这是创建线程的方式之一。

/*** @Author ms* @Date 2024-04-12 18:27*/
public class MyRunnable implements Runnable {public void run() {// 线程执行的代码System.out.println("线程执行啦!");}
}

2、定义一个main函数启动线程。

/*** @Author ms* @Date 2024-04-12 18:27*/
public class ThreadDemo {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();System.out.println("主线程执行啦!");}
}

  上述代码中,MyThread类继承了Thread类,并重写了run()方法。然后,在Main类中,我们创建了一个MyThread对象,并调用start()方法启动线程。

测试结果展示:

在这里插入图片描述

测试代码解析:

  根据如上代码作出解析:要使用这个 MyRunnable 类来创建并启动一个线程,你需要创建它的一个实例,并将这个实例传递给 Thread 类的构造函数。然后,你可以调用 Thread 实例的 start() 方法来启动线程。这里是一个完整的示例,展示了如何使用 MyRunnable 来启动一个线程,在这个例子中,当 thread.start() 被调用时,它会告诉 JVM 要启动一个新的线程,并在这个新线程中执行 MyRunnablerun() 方法。System.out.println("线程执行啦!"); 将会在新线程中执行,并且会在控制台上打印出消息。同时,主线程会继续执行 start() 方法之后的代码,即打印 “主线程在运行…”。

  这种方式是 Java 中创建和管理线程的标准做法之一,它提供了一种灵活的方式来定义线程的工作内容,希望能够帮助到大家。

全文小结

  通过本文的学习,我们了解了多线程的概念、本质和作用。我们比较了使用Runnable接口和Thread类来创建线程的两种方式,并讨论了它们之间的区别。我们还讨论了线程的生命周期以及Java中控制线程的方法。此外,我们介绍了sleep()方法和yield()方法,并比较了它们之间的区别。我们还比较了sleep()方法和wait()方法的区别,并讨论了线程安全问题。最后,我们介绍了同步代码块和同步方法,并讨论了何时会释放对同步监视器锁定以及同步锁和死锁的概念。

总结

  多线程是现代计算机应用程序设计中的重要概念之一。通过使用多线程,我们可以同时执行多个任务,提高系统的资源利用率和响应速度。在Java开发语言中,我们可以使用Runnable接口或Thread类来创建和管理线程。使用多线程有很多优点,也存在一些缺点。在实际应用中,我们应根据具体需求选择合适的线程创建方式和控制方法,以确保程序的性能和可靠性。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

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

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

相关文章

如何配置taro

文章目录 step1. 全局安装wepacksetp2. 使用npm安装tarostep3. 项目初始化 使用taro时需要在本地配置好nodejs环境,关于如何配置nodejs可参考我的这篇博文 如何配置nodejs环境 step1. 全局安装wepack 使用指令npm install webpack -g即可 安装完成后可看到有wepa…

Socket 原理和思考

众所周知Reactor是一种非常重要和应用广泛的网络编程模式,而Java NIO是Reactor模式的一个具体实现,在Netty和Redis都有对其的运用。而不管上层模式如何,底层都是走的Socket,对底层原理的了解会反哺于上层,避免空中楼阁…

前端 JS 经典:数字变化动画

1. 需求 给你一个数字,当这个数字变化时,有一个动画的过渡效果。 2. 思路 首先我们要知道两个数字变化需要多少秒,然后变化的范围,算出变化的速度。记住开始变化的时间,然后通过 requestAnimationFrame 函数&#x…

centos 7.8 安装sql server 2019

1.系统环境 centos 7.8 2.数据库安装文件准备 下载 SQL Server 2019 (15.x) Red Hat 存储库配置文件 sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2019.repo 采用yum源进行不安装下载,这时yum 会自动检测…

算法竞赛数论杂题

menji 和 gcd 题目: 一开始以为是只有l不确定,r是确定的,这样的话我们可以枚举r的所有约数,然后对其每个约数x进行判断,判断是否满足题意,具体做法是先让l % x如果 0则该约数可行,如果不可行…

【机器学习】:线性回归模型学习路线

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

教你python自动识别图文验证码的解决方案!

验证码识别解决方案 对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的&#xff0…

成都爱尔李晓峰主任讲解眼角多出一层“膜”是什么?怎么治

眼角边突然发现长出来一层皮一层膜一样的东西,肉色挡在眼白上呈三角形,这到底是什么? 一种常见眼科疾病“翼状胬肉”,因其形状像昆虫的翅膀而得名的,它是受外界剌激而引起的一种慢性炎症性病变。 覆盖在眼睛表面的那…

JUC并发编程第十三章——读写锁、邮戳锁

本章路线总纲 无锁——>独占锁——>读写锁——>邮戳锁 1 关于锁的面试题 你知道Java里面有那些锁你说说你用过的锁,锁饥饿问题是什么?有没有比读写锁更快的锁StampedLock知道吗?(邮戳锁/票据锁)ReentrantR…

使用自定义注解进行权限校验

一,前言 对于一些重复性的操作我们可以用提取为util的方式进行处理,但也可以更简便一些,比如自定义个注解进行。选择看这篇文章的小伙伴想必都对注解不陌生,但是可能对它的工作原理不太清楚。这里我们用注解实现对接口的权限校验…

Wireshark v4 修改版安装教程(免费开源的网络嗅探抓包工具)

前言 Wireshark(前称Ethereal)是一款免费开源的网络嗅探抓包工具,世界上最流行的网络协议分析器!网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark网络抓包工具使用WinPCAP作为…

基于GWO-CNN-LSTM数据时间序列预测(多输入单输出)-多维时间序列模型-MATLAB实现

基于GWO-CNN-LSTM数据时间序列预测(多输入单输出)-多维时间序列模型-MATLAB实现 基于灰狼优化(Grey Wolf Optimizer, GWO)、卷积神经网络(Convolutional Neural Network, CNN)和长短期记忆网络(Long Short-Term Memor…

【计算机视觉(11)】

基于Python的OpenCV基础入门——图像梯度变换 图像梯度变换Sobel算子Scharr算子Laplacian算子 图像梯度变换的代码实现以及效果图 图像梯度变换 图像梯度变换可以用于边缘检测、特征提取、增强图像和压缩图像等多种任务。图图像梯度可以把图像看成二维离散函数,图像…

什么是进程?

目录 进程 进程的特征, 概念 我们下面先简单介绍一下什么是进程 接下来看看一个程序的运行过程 进程的组成 进程的状态和转换 进程的状态 进程状态的转换 ​编辑 进程的组织方式 进程控制 如何实现进程控制 为什么进程控制的过程需要一气呵成? 进程控制的实现…

前端初学java

目录 java术语 JDK Javac Java Jdb Jhat JVM JRE JAR JDK下载 运行java文件 字面量 隐式转换 强制转换 注意 运算符 &&、||、&、| Switch 程序入口 String[] args 数组 静态初始化 动态初始化 变量初始化 Java内存 方法 重载 Final 包 …

智警杯数据库学习(1)

CentOS中安装MySQL数据库 检测系统是否自带安装 MySQL 首先检查是否自带mysql rpm -qa | grep mysql 如果有删除 rpm -e mysq 未安装,开始安装 进入software目录,解压安装包mysql5.7.25 cd /root/software tar -xvf mysql-5.7.25-1.el7.x86_64.rp…

【决战欧洲杯巅峰】欧洲杯含金量比世界杯高吗?有走地数据分析软件吗?

关于欧洲杯和世界杯的含金量对比,这是一个相当主观的问题,因为两者的价值和重要性很大程度上取决于个人的喜好和观点。但我可以从一些关键方面来为你提供比较的视角。 首先,从参赛队伍和竞技水平来看,世界杯无疑是全球范围内最具…

[渗透测试学习] SolarLab-HackTheBox

SolarLab-HackTheBox 信息搜集 nmap扫描端口 nmap -sV -v 10.10.11.16扫描结果如下 PORT STATE SERVICE VERSION 80/tcp open http nginx 1.24.0 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows n…

C/S、B/S架构(详解)

一、CS、BS架构定义 CS架构(Client-Server Architecture)是一种分布式计算模型,其中客户端和服务器之间通过网络进行通信。在这种架构中,客户端负责向服务器发送请求,并接收服务器返回的响应。服务器则负责处理客户端的…

浅谈RC4

一、什么叫RC4?优点和缺点 RC4是对称密码(加密解密使用同一个密钥)算法中的流密码(一个字节一个字节的进行加密)加密算法。 优点:简单、灵活、作用范围广,速度快 缺点:安全性能较差&…