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 !!!


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

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

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

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

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

相关文章

【递归、搜索与回溯】综合练习四

综合练习四 1.单词搜索2.黄金矿工3.不同路径 III 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.单词搜索 题目链接:79. 单词搜…

前端路线指导(3):前端进阶版学习路线

前端进阶版学习路线: 哈喽大家好!我是小粉,双一流本科,自学前端一年,收获腾讯,字节等9家互联网大厂offer,秋招面试通过率100%,其中半数offer为ssp(薪资最高档&#xff09…

如何查看公网IP?

什么是公网IP? 公网IP(Internet Protocol)是指分配给互联网上的计算机设备的唯一标识符。公网IP地址是由互联网服务提供商(ISP)分配给用户设备,使其可以与全球范围内的其他设备进行通信。公网IP地址通常采…

【超越拟合:深度学习中的过拟合与欠拟合应对策略】

如何处理过拟合 由于过拟合的主要问题是你的模型与训练数据拟合得太好,因此你需要使用技术来“控制它”。防止过拟合的常用技术称为正则化。我喜欢将其视为“使我们的模型更加规则”,例如能够拟合更多类型的数据。 让我们讨论一些防止过拟合的方法。 获…

代理模式(静态代理/动态代理)

代理模式(Proxy Pattern) 一 定义 为其他对象提供一种代理,以控制对这个对象的访问。 代理对象在客户端和目标对象之间起到了中介作用,起到保护或增强目标对象的作用。 属于结构型设计模式。 代理模式分为静态代理和动态代理。…

视频监控统一管理平台LntonCVS安防视频监控系统视频汇聚方案

LntonCVS平台最初被设计为一个以视频汇聚为核心的平台。那么,什么是视频汇聚平台,以及它是如何处理视频资源的呢?简单来说,视频汇聚平台能够从不同的视频源(如直播和点播)收集、整合和展示视频内容。以下是…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 身高差值排序(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

vue3+element ui +ts 封装周范围选择器

vue3element ui ts 封装周范围选择器 在业务场景中,产品需要在页面中使用周范围选择器,我们在使用ant-design的时候里面是有自带的,但是在emement中只有指定周的范围选择器: 这个是ant-design的周范围选择器 这个是element ui 的…

.net 奇葩问题调试经历之1——在红外相机获取温度时异常

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔序言 我们在研发中,经常除了造产品…

C#的Switch语句2(case后的值与模式匹配)

文章目录 switch语法结构case具体的值枚举值字符串const关键字 如果没有匹配的值default语句不一定要在最后 模式匹配与C的差异-case穿透(Fall-through)下一篇文章 switch语法结构 基础的语法结构,在上一篇文章已经写了,具体请看…

Shiro550 反序列化漏洞(CVE-2016-4437)

目录 Shiro介绍 漏洞原理 判断是否存在漏洞 利用ShiroExploit工具执行命令: 利用shiro-exploit工具综合利用工具执行命令: 这一篇是参考别的师傅的好文章对Shiro550反序列化漏洞的学习和练习 Shiro介绍 Apache Shiro是一个强大易用的java安全框架…

ASP.NET MVC企业级程序设计(增删,页面水平排列,字符串拼接,非空,添加框内默认提示)

目录 题目: 实现过程 控制器代码 DAL BLL Index Deile 题目: 实现过程 控制器代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MvcApplication1.Models;namespac…

Tensorflow入门实战 T05-运动鞋识别

目录 一、完整代码 二、训练过程 (1)打印2行10列的数据。 (2)查看数据集中的一张图片 (3)训练过程(训练50个epoch) (4)训练结果的精确度 三、遇到的问…

Docker环境离线安装

Docker环境离线安装 下载下列.deb包 sudo *.deb

【PyQt5】python桌面级应用开发:PyQt5介绍,开发环境搭建快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

天津媒体邀约,及媒体名单?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 天津作为中国北方的重要城市,拥有丰富的媒体资…

Jenkins+K8s实现持续集成(二)

部署前呢,要先把jenkins搭建好。 同时呢已经有了k8s的环境。 基于以上两步已经有了的情况,继续要实现jenkinsk8s持续集成,需要先准备四个文件: Dockerfile首先要准备好一个Dockerfile文件,用于构建Docker镜像的文本…

最新版本IntelliJ IDEA安装与“坤活”使用

最新版本IntelliJ IDEA安装与“科学”使用 IntelliJ IDEA安装与坤活下载安装坤活idea1.将下面两个压缩文件解压到安装位置,注意路径不要包含中文空格等特殊符号2.双击 install-all-users.vbs ,然后点击确定,等到出现 Done的弹窗3. 打开idea复…

函数依赖集等价、最小函数依赖集

一、函数依赖集等价 1、定义 假设F、G为一个关系模式上的两个函数依赖集,若,则称F和G是等价的,也可称F和G 互相覆盖。 2、判断 (1)引理3: 的充分必要条件是且 (2)两步走&…

密码学及其应用——为什么选择接近的质数因子对RSA加密算法不安全?

RSA加密算法是一种广泛使用的非对称加密算法,它的安全性依赖于大整数分解的难度。具体来说,RSA算法生成的公钥包含一个大整数N,这是两个大质数p和q的乘积。然而,如果这两个质数p和q太接近,则可以相对容易地对N进行因式…