滚雪球学Java(80):线程操作的必杀技:学会JavaSE中线程的创建、启动和终止

本文主要是介绍滚雪球学Java(80):线程操作的必杀技:学会JavaSE中线程的创建、启动和终止,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

文章目录

  • 前言
  • 摘要
  • 正文
    • 简介
    • 源代码解析
      • 通过继承Thread类创建线程
      • 通过实现Runnable接口创建线程
    • 应用场景案例
      • 1. 多线程下载文件
      • 2. 多线程爬虫
      • 3. 生产者-消费者模式
    • 优缺点分析
      • 优点
      • 缺点
    • 类代码方法介绍
      • Thread类
        • 构造方法:
        • 常用方法:
      • Runnable接口
        • 方法:
    • 测试用例
      • 测试结果
      • 测试代码分析
    • 全文小结
  • 总结
    • 附录源码
  • ☀️建议/推荐你
  • 📣关于我

前言

  在Java开发中,线程的创建、启动和终止是非常重要的知识点。线程的使用可以提高程序的并发性和响应性,使得程序具备同时执行多个任务的能力。本文将以Java开发语言为例,介绍线程的创建、启动和终止的相关知识。

摘要

  本文将重点介绍JavaSE中线程的创建、启动和终止的方法。首先,我们将通过源代码解析来了解线程的创建和启动的过程。然后,我们将提供一些实际应用场景案例,并分析线程的优缺点。接着,我们将介绍一些常用的线程类和方法,并提供相应的代码示例和测试用例。最后,我们将对全文进行小结和总结。

正文

简介

  在Java开发中,线程是程序执行的基本单位。一个线程可以看作是一个独立的执行路径,它可以并发地执行多个任务。线程的创建、启动和终止是线程编程的基础知识。

  在JavaSE中,线程的创建有两种常见的方法:一种是通过继承Thread类并重写run方法,另一种是通过实现Runnable接口并实现run方法。线程的启动是通过调用start方法来实现的。线程的终止可以通过调用stop方法来强制终止线程,也可以通过合理设置线程的状态来使线程自然终止。

  下面,我们将通过源代码解析来详细了解线程的创建和启动的过程。

源代码解析

通过继承Thread类创建线程

package com.demo.javase.day80;/*** @Author bug菌* @Date 2023-12-27 18:29*/
public class MyThread extends Thread {public void run() {// 线程执行的代码逻辑System.out.println("执行MyThread:打印");}
}

代码解析:

  这段代码定义了一个名为MyThread的类,该类继承自Thread类,并重写了run()方法。run()方法中包含了线程执行的代码逻辑。

  在run()方法中,有一行代码打印了一条信息:“执行MyThread:打印”。

  这个类可以通过创建对象并调用start()方法来启动一个新线程,并在新线程中执行run()方法中的代码逻辑。

  上述代码定义了一个继承自Thread类的MyThread类,并重写了run方法。在run方法中,可以编写线程的执行代码逻辑。

  要创建并启动线程对象,可以使用如下方式:

MyThread myThread = new MyThread();
myThread.start();

  在上述代码中,首先创建了一个MyThread对象myThread,然后调用了start方法来启动线程。

  需要注意的是,尽管MyThread类继承自Thread类,但并不是通过直接调用run方法来启动线程。而是通过调用start方法来启动线程。start方法会启动一个新线程,并在新线程中调用run方法。

通过实现Runnable接口创建线程

package com.demo.javase.day80;/*** @Author bug菌* @Date 2023-12-27 18:30*/
public class MyRunnable implements Runnable {public void run() {// 线程执行的代码逻辑System.out.println("执行MyRunnable:打印");}
}

代码解析:

  这段代码定义了一个实现了Runnable接口的类MyRunnable,该类中实现了run方法,run方法中的代码逻辑将在线程启动后被执行。

  在run方法中,代码逻辑只有一行,即打印"执行MyRunnable:打印"。

  这段代码没有包含线程的启动逻辑,只是定义了线程执行的代码块。如果要创建一个线程并执行MyRunnable中的代码逻辑,需要在主线程中调用该类的run方法,或者使用Thread类将该类作为参数进行创建线程并启动。例如:

MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();

  这段代码创建了一个MyRunnable的实例,然后将该实例作为参数传递给Thread类的构造方法,并调用start方法启动线程。启动线程后,线程会自动执行MyRunnable类中的run方法中的代码块,即打印"执行MyRunnable:打印"。

  上述代码定义了一个实现了Runnable接口的MyRunnable类,并实现了run方法。在run方法中,可以编写线程的执行代码逻辑。

  要创建并启动线程对象,可以使用如下方式:

MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();

  在上述代码中,首先创建了一个MyRunnable对象myRunnable,然后创建了一个Thread对象thread,并将myRunnable作为参数传入Thread的构造方法中。最后,调用thread的start方法来启动线程。

  需要注意的是,虽然MyRunnable类实现了Runnable接口,但并不是通过直接调用run方法来启动线程。而是通过创建一个Thread对象,并将MyRunnable对象作为参数传入Thread的构造方法中,然后调用Thread对象的start方法来启动线程。

应用场景案例

以下是一些常见的应用场景案例,展示了线程在实际开发中的应用:

1. 多线程下载文件

  假设我们需要下载一个大文件,为了提高下载速度,可以使用多线程来同时下载文件的不同部分。每个线程负责下载文件的一部分,并将下载的部分进行合并,最终得到完整的文件。

2. 多线程爬虫

  在互联网爬虫中,我们通常需要同时抓取多个网页的内容。为了提高效率,可以使用多线程来并发地抓取网页。每个线程负责抓取一个网页的内容,然后将抓取的结果进行处理。

3. 生产者-消费者模式

  在多线程编程中,生产者-消费者模式是一种常见的线程协作模式。生产者负责生产数据,将数据放入共享的缓冲区中;消费者负责从缓冲区中取出数据进行处理。通过使用多线程,可以实现生产者和消费者的并行执行,提高整个系统的吞吐量。

优缺点分析

优点

  • 提高程序的并发性和响应性,使得程序具备同时执行多个任务的能力。
  • 提高系统的吞吐量,提高系统的性能。

缺点

  • 多线程编程相对复杂,容易引发线程安全问题,需要加强对线程同步和互斥的处理。
  • 线程的创建、启动和终止需要占用一定的系统资源。

类代码方法介绍

Thread类

构造方法:
  • Thread():创建一个新的线程对象。
  • Thread(String name):创建一个带有指定名字的新的线程对象。
  • Thread(Runnable target):创建一个新的线程对象,并设置目标对象。
  • Thread(Runnable target, String name):创建一个新的线程对象,并设置目标对象和名字。
常用方法:
  • void start():启动线程。
  • void run():线程的执行逻辑,需要通过重写该方法来定义线程的执行代码。
  • void join():等待线程终止。
  • boolean isAlive():判断线程是否处于活动状态。

Runnable接口

方法:
  • void run():线程的执行逻辑,需要通过实现该接口并实现run方法来定义线程的执行代码。

测试用例

以下是一个简单的测试用例,用于演示线程的创建和启动过程:

package com.demo.javase.day80;/*** @Author bug菌* @Date 2023-12-27 18:29*/
public class ThreadDemo {public static void main(String[] args) {// 创建线程对象MyThread myThread = new MyThread();// 启动线程myThread.start();// 创建线程对象MyRunnable myRunnable = new MyRunnable();// 创建线程Thread thread = new Thread(myRunnable);// 启动线程thread.start();}
}

  在上述代码中,我们创建了一个继承自Thread类的线程对象myThread,以及一个实现了Runnable接口的线程对象myRunnable。然后分别调用了它们的start方法来启动线程。

测试结果

  根据如上的测试用例,作者在本地进行测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加其他的测试数据或测试方法,以便于进行熟练学习以此加深知识点的理解。

在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  该代码是一个Java程序的入口类,包名为com.demo.javase.day80

  在main方法中,首先创建了一个MyThread对象myThread,然后调用myThread.start()启动了该线程。MyThread类是一个继承自Thread类的自定义线程类,其实现了run方法。

  接着,创建了一个MyRunnable对象myRunnable,然后创建了一个Thread对象thread,并将myRunnable传入thread的构造方法中。MyRunnable类是实现了Runnable接口的自定义线程类,其实现了run方法。

  最后,调用thread.start()启动了thread线程。

  总结:该代码通过创建继承自Thread类的线程对象和实现Runnable接口的线程对象,并启动这两个线程,在实际运行时会同时执行两个线程的run方法。

全文小结

  本文以JavaSE中线程的创建、启动和终止为主要内容,通过源代码解析、应用场景案例和优缺点分析来介绍了线程的相关知识。同时,还提供了一些常用的线程类和方法,并给出了相应的代码示例和测试用例。

  通过学习本文,我们可以了解到线程的创建、启动和终止的方法,以及线程在实际开发中的应用场景和优缺点。希望本文对读者在多线程编程方面的学习和应用有所帮助。

总结

  线程的创建、启动和终止是Java开发中重要的知识点。本文通过源代码解析、应用场景案例和优缺点分析,详细介绍了线程的相关知识。同时,还提供了一些常用的线程类和方法,并给出了相应的代码示例和测试用例。更多的还是要自己多去琢磨, 以上内容都是简单带你入门把握基础知识。

  … …

  好啦,这期的内容就基本接近尾声啦,若你想学习更多,你可以看看专栏的导读篇《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。功不唐捐,久久为功!

「赠人玫瑰,手留余香」,咱们下期拜拜~~

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你

  无论你是计算机专业的学生,还是对编程感兴趣的跨专业小白,都建议直接入手「滚雪球学Java」专栏;该专栏不仅免费,bug菌还郑重承诺,只要你学习此专栏,均能入门并理解Java SE,以全网最快速掌握Java语言,每章节源码均同步「Gitee」,你真值得拥有;学习就像滚雪球一样,越滚越大,带你指数级提升。

  码字不易,如果这篇文章对你有所帮助,帮忙给bugj菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

  同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。


这篇关于滚雪球学Java(80):线程操作的必杀技:学会JavaSE中线程的创建、启动和终止的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912908

相关文章

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D