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

news2024/11/22 3:13:28

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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.coloradmin.cn/o/1841263.html

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

相关文章

支持向量机 (SVM) 算法详解

支持向量机 (SVM) 算法详解 支持向量机(Support Vector Machine, SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM 特别适合高维数据,并且在处理复杂非线性数据时表现出色。本文将详细讲解 SVM 的原理、数学公式、应用场景…

[Qt的学习日常]--窗口

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、窗口的分…

最新!!单目深度估计方向文献综述--Monocular Depth Estimation: A Thorough Review

论文链接:https://ieeexplore.ieee.org/abstract/document/10313067 Abstract 一个是考虑人类深度感知的机制,另一个是包括各种深度学习方法。 这篇论文是关于单目深度估计(Monocular Depth Estimation)的全面综述,由…

Flutter第十三弹 路由和导航

目标: 1.Flutter怎么创建路由? 2.怎么实现路由跳转?页面返回? 一、路由 1.1 什么是路由? 路由(Route)在移动开发中通常指页面(Page),在Android中通常指一个Activity。所谓路由管…

wsl报错在BIOS中启用虚拟化

解决: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All 以高级管理员身份运行powershell,执行如上命令。

GoldWave软件下载 GoldWave 音频处理软件 v6.80.0 官方版下载附加详细安装步骤

准确来讲GoldWave软件防止GoldWave *原生音频插件被禁用。根据大数据结果显示回声效果:回声,顾名思义是指声音发出后经过一定的时间再返回被我们听到,就象在旷野上面对高山呼喊一样,在很多视频剪辑、配音中广泛采用, G…

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

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

【ajax基础04】form-serialize插件

目录 一:form-serialize插件 作用: 语法格式: 一:form-serialize插件 作用: 快速且大量的收集表单元素的值 例如上图对于多表单元素的情形,单靠通过”选择器获取节点.value”值的形式,获取…

Blazor 组件:创建、生命周期、嵌套和 UI 集成

在本文中,您将获得以下问题的答案。 什么是 Blazor 组件?如何使用组件?Blazor 组件的生命周期是什么?我们可以从一个组件调用另一个组件吗?如何创建 Blazor 组件?在组件中哪里写 C# 代码? 什么…

百度文心智能体平台(想象即现实):轻松上手,开启智能新时代!创建属于自己的智能体应用。

目录 1.1、文心智能体平台 1.2、创建智能体 1.3、智能体报名入口 1.4、古诗词小助手 1.5、访问我的智能体 在这个全新的时代里,人工智能技术正以前所未有的速度发展,渗透到我们生活的方方面面。无论是智能家居、自动驾驶,还是医疗诊断、…

漏洞挖掘 | 记一次src挖掘-小程序敏感信息泄露

权当是一次漏洞挖掘的思路分享 闲言 就现在的一个web漏洞挖掘强度还是非常高的,所以我们不妨把我们的眼光投向一个之前可能未曾涉及到的区域———小程序 是的微信小程序,这玩意的防范能力和过滤能力其实对比web方向是要弱小很多的 进入正题 以下就是…

如何设置Excel单元格下拉列表

如何设置Excel单元格下拉列表 在Excel中设置单元格下拉列表可以提高数据输入的准确性和效率。以下是创建下拉列表的步骤: 使用数据验证设置下拉列表: 1. 选择单元格: 选择你想要设置下拉列表的单元格或单元格区域。 2. 打开数据验证&…

充电学习—8、Type-C TCPC TCPCI

TCPC是usb Type-C port controller; 通用串行总线C型端口控制器 TCPCI是tcpc控制器接口规范; TCPC是个功能块,其中含有VBUS和VCONN的电源控制功能,CC信号的处理 逻辑,PD应用中的BMC物理层和协议层(PD信息…

配置环境常规操作

一、看看显卡情况 1、看显卡驱动: nvidia-smi 2、验证cuda是否安装成功 nvcc -V 二、conda创建环境 conda create --name PatchCore_anomaly_detection python3.9 conda activate PatchCore_anomaly_detection 三、配置虚拟环境 cd C:\BaiduNetdiskDownload…

OSPF和RIP的路由引入(华为)

#交换设备 OSPF和RIP的路由引入 不同的网络会根据自身的实际情况来选用路由协议。比如有些网络规模很小,为了管理简单,部署了 RIP; 而有些网络很复杂,可以部署 OSPF。不同路由协议之间不能直接共享各自的路由信息,需要依靠配置路…

海外优青ppt美化_海优ppt录音视频制作

海外优青 优秀青年科学基金项目(海外)旨在吸引和鼓励在自然科学、工程技术等方面已取得较好成绩的海外优秀青年学者(含非华裔外籍人才)回国(来华)工作,自主选择研究方向开展创新性研究&#xf…

win 打包java项目为exe一键部署,包括mysql和redis

需求:打包springboot项目在win系统下执行,并且要一键部署和开机启动 把所需的程序放在同一个文件夹 1.jdk文件夹:自己去下载,jdk8的话拿jre目录好了 2.mysql文件夹:是8.0.36版,270M精简版了 3.redis文件夹…

Springboot整合Zookeeper分布式组件实例

一、Zookeeper概述 1.1 Zookeeper的定义 Zookeeper是一个开源的分布式协调服务,主要用于分布式应用程序中的协调管理。它由Apache软件基金会维护,是Hadoop生态系统中的重要成员。Zookeeper提供了一个高效且可靠的分布式锁服务,以及群集管理…

深入探讨:UART与USART在单片机中串口的实际应用与实现技巧

单片机(Microcontroller Unit, MCU)是一种集成了处理器、存储器和输入输出接口的微型计算机。它广泛应用于嵌入式系统中,用于控制各类电子设备。UART和USART是单片机中常见的通信接口,负责串行数据传输。下面我们详细介绍它们在单…

【机器学习系列】Python实战:使用GridSearchCV优化AdaBoost分类器及其基分类器

目录 一、AdaBoost的标准实现中是否支持使用不同类型的基分类器? 二、Adaboost的参数 三、Python实现Adaboost (一)导入库和数据集 (二) 划分训练集 (三)选择基分类器--决策树 (四)创建Ada…