【JAVA-Day77】Java线程继承Thread类实现Runnable接口

news2024/11/30 2:26:58

Java线程继承Thread类实现Runnable接口

  • 《Java线程编程指南:轻松掌握线程的创建和启动》
    • 摘要 😊
    • 引言 🚀
      • 一、什么是进程和线程 ❓
      • 二、线程如何创建 😎
        • 2.1 继承Thread类并重写run()方法 📝
        • 2.2 实现Runnable接口并实现run()方法 💡
      • 三、线程如何启动 🚀
      • 四、线程的应用场景 🌐
      • 五、线程面试题 💬
      • 六、总结 📌
    • 参考资料 📚

在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


《Java线程编程指南:轻松掌握线程的创建和启动》

摘要 😊

作为Java博主,想要让你轻松掌握线程的创建和启动,本文将详细介绍线程的概念、创建方法、启动方式以及常见应用场景,同时还包括一些有趣的面试题。让我们一起深入探讨,让线程编程变得简单有趣!

引言 🚀

在Java编程中,线程是一个至关重要的概念。了解如何创建和启动线程是每个Java程序员的基本功。本文将为您详细介绍线程的创建方式,并通过丰富的代码案例演示,带您深入理解。

一、什么是进程和线程 ❓

进程和线程是操作系统中重要的概念,它们都是用来管理和执行程序的方式。在计算机科学中,进程(Process)是指正在运行的一个程序的实例,它包括了程序的代码、数据和程序执行时所需的系统资源。而线程(Thread)是进程中的一个独立执行单元,一个进程可以拥有多个线程,这些线程共享了进程的资源,包括内存空间、文件句柄等,但每个线程拥有自己的执行路径和局部变量。相比于进程,线程更加轻量级,创建和切换的开销更小,因此可以更高效地实现并发执行和资源共享。

二、线程如何创建 😎

在Java中,线程的创建有两种常见方式:继承Thread类和实现Runnable接口。接下来我们将分别介绍这两种方式。

2.1 继承Thread类并重写run()方法 📝

继承Thread类并重写run()方法是一种创建线程的简单方式。下面是一个示例代码:

public class MyThread extends Thread {
    public void run() {
        // 线程执行的任务
        System.out.println("线程执行任务");
    }

    public static void main(String[] args) {
        // 创建线程对象
        MyThread myThread = new MyThread();
        // 启动线程
        myThread.start();
    }
}

在这个示例中,MyThread类继承了Thread类,并重写了run()方法来定义线程执行的任务。在main()方法中,创建了一个MyThread对象,并调用start()方法启动线程。一旦线程启动,run()方法中的任务就会在新的线程中执行。

2.2 实现Runnable接口并实现run()方法 💡

通过实现Runnable接口并实现其中的run()方法,可以创建线程的另一种方式。这种方式更加灵活,因为Java不支持多重继承,但是可以实现多个接口。下面是一个示例代码:

public class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的任务
        System.out.println("线程执行任务");
    }

    public static void main(String[] args) {
        // 创建一个实现了Runnable接口的对象
        MyRunnable myRunnable = new MyRunnable();
        // 创建线程对象,并将Runnable对象作为参数传递给Thread类的构造方法
        Thread thread = new Thread(myRunnable);
        // 启动线程
        thread.start();
    }
}

在这个示例中,MyRunnable类实现了Runnable接口,并实现了其中的run()方法。在main()方法中,创建了一个MyRunnable对象,并将其作为参数传递给Thread类的构造方法来创建线程对象。然后调用线程对象的start()方法启动线程,线程执行的任务就是run()方法中定义的内容。

三、线程如何启动 🚀

在Java中,要启动一个线程,你可以通过调用线程对象的start()方法来实现。这个方法会使得新线程开始执行它的任务,具体步骤如下:

  1. 创建一个线程对象,可以通过继承Thread类并重写run()方法,或者实现Runnable接口并实现其中的run()方法来创建线程对象。
  2. 调用线程对象的start()方法。这个方法会告诉Java虚拟机启动线程,并在新的线程中执行run()方法中的任务。

以下是一个示例代码:

public class Main {
    public static void main(String[] args) {
        // 继承Thread类的方式创建线程
        MyThread myThread = new MyThread();
        myThread.start();

        // 实现Runnable接口的方式创建线程
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

在这个示例中,MyThreadMyRunnable分别是通过继承Thread类和实现Runnable接口的方式创建的线程。通过调用start()方法,这些线程就会启动并执行它们的任务。

四、线程的应用场景 🌐

线程在Java编程中的应用场景非常广泛,主要包括以下几个方面:

  1. 多线程下载: 在网络编程中,使用多线程可以实现文件的多线程下载,加快下载速度。每个线程负责下载文件的一部分,从而充分利用带宽资源。


    在网络编程中,使用多线程进行文件的多线程下载可以显著提高下载速度,尤其是对于大文件或者带宽较大的网络环境。这种方法充分利用了带宽资源,将文件分成多个部分,每个线程负责下载其中的一部分,然后将这些部分合并成完整的文件。具体步骤如下:

    1. 确定文件大小和分块大小: 首先确定要下载的文件的大小,并确定每个线程下载的分块大小。通常情况下,可以将文件平均分成若干个分块,每个分块大小相同或者差不多。

    2. 创建多个线程: 根据文件的分块数,创建相应数量的线程。每个线程负责下载文件的一个分块。

    3. 指定下载范围: 每个线程需要知道自己下载的文件范围,即从哪个字节开始下载,到哪个字节结束。可以通过设置HTTP请求的Range头部来指定下载范围。

    4. 并发下载: 启动所有线程,让它们并发执行。每个线程根据自己负责的下载范围发送HTTP请求,下载文件的对应部分。

    5. 合并文件: 所有线程下载完成后,将它们下载的文件部分合并成完整的文件。可以通过文件操作来实现文件的合并,将每个分块按照顺序写入到最终的文件中。

    需要注意的是,在实现多线程下载时,还需要考虑线程安全、异常处理、断点续传等问题,确保下载过程稳定可靠。另外,为了避免对服务器造成过大的压力,下载线程的数量需要适当控制。

  2. 并发处理: 在需要处理大量任务的情况下,使用多线程可以并发处理任务,提高程序的处理效率。例如,在Web服务器中,每个请求可以由一个独立的线程来处理,从而支持同时处理多个请求。


    在需要处理大量任务的情况下,使用多线程可以实现并发处理,从而提高程序的处理效率。这在很多场景下都是非常有用的,比如在Web服务器中。

    在Web服务器中,每个客户端请求可以由一个独立的线程来处理,这意味着服务器可以同时处理多个请求,而不必等待每个请求都处理完成才能处理下一个请求。具体来说,当一个请求到达服务器时,服务器会创建一个新的线程来处理这个请求,然后继续监听其他请求。这样就可以支持同时处理多个请求,提高了服务器的并发能力和响应速度。

    通过多线程并发处理请求,可以充分利用服务器的资源,提高系统的吞吐量和响应性能。但需要注意的是,在并发处理中,需要考虑线程安全和资源竞争等问题,确保多个线程能够正确地共享资源,并且不会出现数据不一致或者死锁等情况。

    总的来说,使用多线程进行并发处理可以提高程序的处理效率,特别是在需要处理大量任务的情况下,可以充分利用系统资源,提高系统的并发能力和性能。

  3. 线程池: 线程池是一种管理线程的机制,它可以重用已创建的线程,减少线程创建和销毁的开销,提高系统的性能和稳定性。通过线程池,可以控制并发执行的线程数量,防止系统因为线程过多而资源耗尽。


    线程池是一种管理线程的机制,它可以重用已创建的线程,减少线程创建和销毁的开销,从而提高系统的性能和稳定性。通过线程池,可以控制并发执行的线程数量,防止系统因为线程过多而资源耗尽。

    使用线程池的主要好处包括:

    1. 降低资源消耗: 线程池可以重用已创建的线程,避免频繁地创建和销毁线程所带来的资源消耗,从而减少系统的开销。

    2. 提高响应速度: 由于线程池中已经预先创建了一定数量的线程,可以更快地响应任务的到来,减少任务等待的时间。

    3. 控制并发度: 可以通过调整线程池的大小来控制并发执行的线程数量,避免系统因为线程过多而资源耗尽,导致系统的性能下降或者崩溃。

    4. 统一管理: 线程池提供了统一的管理接口,可以方便地监控线程的运行状态、调整线程池的大小、设置线程池的参数等。

    Java提供了java.util.concurrent包中的Executor框架来支持线程池的实现,其中常用的实现类包括ThreadPoolExecutorScheduledThreadPoolExecutor等。通过这些类,可以方便地创建和管理线程池,提高程序的性能和稳定性。

    总的来说,线程池是一种重要的并发编程工具,在需要处理大量任务的情况下,使用线程池可以有效地管理和调度线程,提高系统的性能和响应速度。

  4. GUI编程: 在图形用户界面(GUI)编程中,使用多线程可以实现响应性更好的用户界面。例如,在Swing或JavaFX中,主线程负责用户界面的渲染和事件处理,而后台线程可以处理耗时的任务,避免阻塞主线程导致界面卡顿。


    在图形用户界面(GUI)编程中,使用多线程可以实现更好响应性的用户界面。在Swing或JavaFX等GUI框架中,主线程负责用户界面的渲染和事件处理,而后台线程可以处理耗时的任务,从而避免阻塞主线程导致界面卡顿的情况发生。

    具体来说,GUI编程中主要涉及两个线程:

    1. 主线程(UI线程): 主线程负责处理用户界面的渲染和用户交互事件,例如绘制UI组件、响应用户的鼠标点击和键盘输入等。这个线程是GUI框架内部自动创建和管理的,通常称为UI线程。

    2. 后台线程: 后台线程负责执行耗时的任务,例如从网络或文件系统中读取数据、进行复杂的计算或者与数据库进行交互等。这些任务可能会阻塞主线程,导致界面无法及时响应用户的操作,因此需要在后台线程中执行,避免影响用户体验。

    通过使用多线程,在GUI编程中可以实现以下优势:

    • 提高响应性: 后台线程负责处理耗时任务,主线程可以保持响应性,及时响应用户的操作,提高用户体验。

    • 避免界面卡顿: 将耗时任务放在后台线程中执行,避免阻塞主线程,从而避免界面卡顿或者假死的情况发生。

    • 提高系统性能: 通过合理地利用多线程,可以提高系统的处理效率和性能,更好地满足用户的需求。

    总的来说,使用多线程可以提高GUI编程的响应性和性能,但需要注意线程安全和UI更新等问题,确保多线程编程的稳定性和可靠性。

  5. 定时任务: 使用多线程可以实现定时任务的调度和执行。例如,可以使用ScheduledExecutorService来创建一个定时线程池,执行周期性的任务。


    在Java中,使用多线程可以方便地实现定时任务的调度和执行。其中,ScheduledExecutorService是一个常用的工具类,可以用来创建一个定时线程池,执行周期性的任务。

    下面是一个简单的示例代码,演示了如何使用ScheduledExecutorService来执行定时任务:

    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    public class ScheduledTaskExample {
        public static void main(String[] args) {
            // 创建一个定时线程池,可根据需要设置线程数量
            ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    
            // 延迟1秒后执行任务,并且每隔3秒执行一次
            executor.scheduleAtFixedRate(() -> {
                System.out.println("执行任务:" + System.currentTimeMillis());
            }, 1, 3, TimeUnit.SECONDS);
    
            // 等待一段时间,让任务执行一段时间
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            // 关闭线程池
            executor.shutdown();
        }
    }
    

    在这个示例中,首先通过Executors.newScheduledThreadPool(1)创建了一个定时线程池,线程池中有1个线程。然后使用scheduleAtFixedRate()方法安排一个定时任务,该任务会在延迟1秒后开始执行,并且每隔3秒执行一次。最后,通过调用shutdown()方法关闭线程池。

    使用ScheduledExecutorService可以方便地实现定时任务的调度和执行,而且相比于使用Timer类,它具有更好的灵活性和扩展性。

总的来说,合理地利用线程可以提高程序的效率和性能,但同时也需要注意线程安全和资源竞争等问题,确保多线程的应用能够正常运行并发挥作用。

五、线程面试题 💬

这些是很常见的线程面试题,我可以为每个问题提供简洁的答案:

  1. 什么是线程?如何创建线程?

    • 线程是程序中执行的单元,它是操作系统能够进行运算调度的最小单位。在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。
  2. Thread类和Runnable接口有什么区别?

    • 继承Thread类是一种创建线程的方式,它限制了单继承的特性,但更简单直接;而实现Runnable接口则更加灵活,允许多个接口的实现。
  3. 如何安全地结束一个线程的执行?

    • 可以通过设置一个标志位来控制线程的执行状态,当标志位为true时,线程继续执行;当标志位为false时,线程退出执行。
  4. 什么是线程安全?如何保证线程安全?

    • 线程安全是指多个线程访问共享资源时不会出现数据错误或不一致的情况。可以通过使用同步机制(如synchronized关键字)、使用线程安全的数据结构(如ConcurrentHashMap、CopyOnWriteArrayList等)以及避免共享状态等方式来保证线程安全。

六、总结 📌

通过本文的学习,相信你已经掌握了线程的创建和启动方法,并了解了线程在Java编程中的应用场景。继续深入学习和实践,你会发现线程编程并不难,甚至可以带来乐趣和挑战!

参考资料 📚

  • Java线程:https://docs.oracle.com/javase/tutorial/essential/concurrency/
  • 《Java并发编程实战》
  • 《Java并发编程的艺术》

通过本文的阅读,相信你已经对Java线程编程有了更深入的理解。继续学习,不断实践,你会成为一名优秀的Java程序员!👨‍💻

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

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

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

相关文章

ZISUOJ 2022年算法基础公选课练习四(Map)

说明: 博主为了提早预习数据结构和C的一些知识,自己琢磨外加查阅资料所写的代码,题目来源于22年初的学院老师组织的算法基础公选课的练习。我的代码甚至思路肯定存在许多不足和错误,欢迎大家批评指正。 题目列表: 问题…

操作系统-408

一、操作系统概述 1、定义 负责协调软件和硬件的计算机资源的工作为上层应用提供简易的服务操作系统是系统软件 2、功能: 操作系统是系统资源的管理者 处理机管理存储器管理文件管理设备管理向上层提供方便易用的服务 命令接口程序接口对硬件机器的扩展 3、特征…

(四十)大数据实战——Zabbix监控平台的部署搭建

前言 Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警,这样可以快速反馈服务器的问题。基于已存储的数据,Zabbix提供了出色的报告和数据可视化功能。…

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作),产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后,准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值,不再是新&#xf…

PR:剪辑工具的使用

这些是剪辑工具: 选择工具 用来选择、拉伸或者拖拽用,如果放置到片段开头和结尾处会变成红色带箭头的方框,可以拉升或者缩短片段的时长 如果缩短的话,两段视频之间会出现空挡 可以点击空挡处,右键点击删除波纹&#xf…

Java毕业设计-基于ssh的网上电子商城管理系统-第74期

获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssh的网上电子商城管理系统:前端jsp、js,后端 struts、spring、hibernate,集成商品浏览,商品详情,购物车&…

【Apache Superset】从概述、安装到运用,一篇掌握!

文章目录 什么是 Superset?Superset 的优势安装安装 Anaconda 包管理工具创建 Superset 的 Python 环境 下载 Superset 依赖更新工具安装 Superset配置 MySQL 元数据库初始化 Superset 数据库报错一报错二报错三数据库初始化完成 初始化 Superset报错一警告信息 启动…

【顶刊|修正】多区域综合能源系统热网建模及系统运行优化【复现+延伸】

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序复现《多区域综合能源系统热网建模及系统运行优化》模型并进一步延伸,基于传热学的基本原理建立了区域热网能量传输通用模型,对热网热损方程线性化实现热网能量流建模&#xff…

VueCLI核心知识1:ref属性、props配置、mixin混入

1 ref 属性 ref属性类似于js原生获取DOM元素 <template><div><h1 v-text"msg" ref"title"></h1><button click"showDom">点我输出上方的Dom元素</button><School ref"sch"></School>…

消息队列RabbitMQ-使用过程中面临的问题与解决思路

消息队列在使用过程中会出现很多问题 首先就是消息的可靠性&#xff0c;也就是消息从发送到消费者接收&#xff0c;消息在这中间过程中可能会丢失 生产者到交换机的过程、交换机到队列的过程、消息队列中、消费者接收消息的过程中&#xff0c;这些过程中消息都可能会丢失。 …

UnityShader玉石效果

效果&#xff1a; 代码&#xff1a; Shader "MyShader/Jade" {Properties{_DiffuseColor("漫反射颜色",color)(1,1,1,1)_ThicknessMap("厚度图",2d)"white"{}_AddColor("叠加颜色",color)(1,1,1,1)_CubeMap("环境贴图…

【C++】const、static关键字和构造函数初始化

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 1. const修饰成员函数 1.1 语法格式 1.2 权限放大缩小 1.3 思考 1.4 解答 2. 再谈构造函数 2.1 构造函数体赋值 2.2 初始…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Navigation组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Navigation组件 鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#…

Mybatis开发辅助神器p6spy

Mybatis什么都好&#xff0c;就是不能打印完整的SQL语句&#xff0c;虽然可以根据数据来判断一二&#xff0c;但始终不能直观的看到实际语句。这对我们想用完整语句去数据库里执行&#xff0c;带来了不便。 怎么说呢不管用其他什么方式来实现完整语句&#xff0c;都始终不是Myb…

相机图像质量研究(18)常见问题总结:CMOS期间对成像的影响--CFA

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

B2科目二考试项目笔记

B2科目二考试项目笔记 1 桩考1.1 右起点倒库1.2 移库&#xff08;左→右&#xff09;1.3 驶向左起点1.4 左起点倒库1.5 驶向右起点 2 侧方停车考试阶段&#xff08;从路边开始&#xff09;&#xff1a; 3 直角转弯4 坡道定点停车和起步5 单边桥6 通过限速限宽门7 曲线行驶8 连续…

每日五道java面试题之java基础篇(六)

目录&#xff1a; 第一题&#xff1a;Java 创建对象有哪⼏种⽅式&#xff1f;第二题 .Integer a 127&#xff0c;Integer b 127&#xff1b;Integer c 128&#xff0c;Integer d 128&#xff1b;相等吗?第三题.Object 类的常⻅⽅法?第四题 List和Set的区别第五题 ArrayList和…

代码解读:Stable Video Diffusion 中对运动程度的控制

Diffusion Models视频生成-博客汇总 前言&#xff1a;在SVD中&#xff0c;对运动的控制可以分成对镜头运动的控制和对内容运动的控制&#xff0c;这篇博客详细通过代码讲解如何对内容运动的控制。 目录 方法一&#xff1a;motion_bucket_id 简述 代码解读 方法二&#xff1…

【Linux】yum软件包管理器

目录 Linux 软件包管理器 yum 什么是软件包 Linux安装软件 查看软件包 关于rzsz Linux卸载软件 查看yum源 扩展yum源下载 Linux开发工具 vim编辑器 上述vim三种模式之间的切换总结&#xff1a; 命令模式下&#xff0c;一些命令&#xff1a; vim配置 Linux 软件包管理…

BUGKU-WEB 社工-初步收集

题目描述 题目截图如下&#xff1a; 描述:其实是杂项&#xff0c;勉强算社工吧。来自当年实战 进入场景看看&#xff1a; 解题思路 做题先看源码关注可下载的资源(zip压缩包)抓包寻找可能存在的加密信息&#xff08;base64&#xff09;不管三七二十一先扫描目录再说 ps&…