Java多线程入门案例详解:继承Thread类实现线程

 本文通过一个简单案例,讲解如何通过继承 Thread 类来实现多线程程序,并详细分析了代码结构与运行机制。


一、前言

在 Java 中,实现多线程主要有两种方式:

  • 继承 Thread

  • 实现 Runnable 接口

本文以继承 Thread 类为例,通过一个简单的例子来带大家理解线程的基本创建与启动流程。


二、示例代码

下面是本次讲解的完整代码:

package thread.test;// 定义一个继承自 Thread 类的 MyThread2 类
class MyThread2 extends Thread {// 重写 run() 方法,定义线程执行的任务@Overridepublic void run() {// 无限循环,让线程持续执行while (true) {// 打印 "hello thread"System.out.println("hello thread");// 让当前线程休眠 1 秒钟try {Thread.sleep(1000);} catch (InterruptedException e) {// 处理线程被中断的异常throw new RuntimeException(e);}}}
}public class ThreadDemo2 {public static void main(String[] args) {// 创建 MyThread2 类的实例Thread myThread2=new MyThread2();// 调用 start() 方法启动新线程myThread2.start();// 主线程中的无限循环while (true) {// 打印 "hello main"System.out.println("hello main");// 主线程也休眠 1 秒钟try {Thread.sleep(1000);} catch (InterruptedException e) {// 处理线程被中断的异常throw new RuntimeException(e);}}}}

三、代码详解

1. 定义线程类

通过继承 Thread 类,并重写 run() 方法,定义线程要执行的逻辑。

class MyThread2 extends Thread {@Overridepublic void run() {while (true) {System.out.println("hello thread");Thread.sleep(1000);}}
}
  • 通过 new 创建线程对象。

  • 调用 start() 方法来真正启动一个新线程

    • start() 方法内部会调用底层操作系统开辟新线程,并最终执行 run() 方法。

    • 如果直接调用 run(),则只是普通的方法调用,不会开启新线程!


3. 主线程与子线程并发执行

主线程本身也进入一个无限循环:

while (true) {System.out.println("hello main");Thread.sleep(1000);
}
  • 主线程也每秒打印一次 "hello main"

  • 这样,主线程和子线程各自独立运行,同时输出不同的信息。


四、程序运行结果

运行程序后,控制台将交替输出:

hello main
hello thread
hello thread
hello main
hello main
hello thread
hello main
hello thread
hello main
hello thread
hello main
hello thread
hello main
hello thread
hello main
hello thread
hello main
hello thread
^C进程已结束,退出代码为 130 (interrupted by signal 2:SIGINT)

但由于线程调度由操作系统控制,因此有时候输出顺序不一定完全规律,比如连续两次出现 "hello thread""hello main" 都是正常的。


五、注意事项

  • 线程安全:本例子中各线程互不干扰。但在实际开发中,如果多个线程操作共享资源,需要考虑线程安全问题。

  • 优雅地处理中断:在捕获 InterruptedException 后,实际项目中建议打断循环优雅退出,而不是简单地抛出异常。

  • 线程销毁:本例代码是无限循环,因此线程不会主动退出,实际开发中应该根据业务逻辑合理控制线程生命周期。


六、总结

通过继承 Thread 类,我们可以快速创建并启动一个新线程,但这种方式有一定局限性,比如:

  • Java 单继承的局限(一个类只能继承一个父类)

  • 扩展性较差

因此,在实际开发中,更推荐实现 Runnable 接口来创建线程,能够让代码更加灵活、解耦。

不过,对于初学者来说,通过继承 Thread 来理解线程基本运行原理是非常重要的一步!

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

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

相关文章

Netty在线客服系统落地方案

本文不讲然后代码方面的东西,只聊方案!! 这方案基于 Spring Boot 2.6、Netty、MyBatis Plus、Redis 构建的一套支持 单体应用 的在线客服系统。 系统支持客户自由与后台客服实时聊天、客服未在线钉钉提醒通知客服、消息已读未读标记、消息已…

SDK游戏盾、高防IP、高防CDN三者的区别与选型指南

在网络安全防护领域,SDK游戏盾、高防IP和高防CDN是常见的解决方案,但各自的功能定位、技术实现和适用场景差异显著。本文将通过对比核心差异,帮助您快速理解三者特点并选择适合的防护方案。 一、核心功能定位 SDK游戏盾 功能核心&#xff1a…

GRPO有什么缺点,如何改进?

一、GRPO的核心原理与设计目标 Group Relative Policy Optimization(GRPO)是DeepSeek团队提出的一种强化学习算法,旨在解决传统PPO(Proximal Policy Optimization)在大语言模型(LLM)训练中的资源消耗问题。其核心创新在于 通过组内相对奖励替代价值函数(Critic Model)…

登高架设作业指的是什么?有什么安全操作规程?

登高架设作业是指在高处从事脚手架、跨越架架设或拆除的作业。具体包括以下方面: 脚手架作业 搭建各类脚手架,如落地式脚手架、悬挑式脚手架、附着式升降脚手架等,为建筑施工、设备安装、高处维修等作业提供安全稳定的工作平台。对脚手架进行…

前端实现商品放大镜效果(Vue3完整实现)

前端实现商品放大镜效果(Vue3完整实现) 前言 在电商类项目中,商品图片的细节展示至关重要。放大镜效果能显著提升用户体验,允许用户在不跳转页面的情况下查看高清细节。本文将基于Vue3实现一个高性能的放大镜组件,完整…

【C++11特性】Lambda表达式(匿名函数)

一、函数对象 在C中,我们把所有能当作函数使用的对象当作函数对象。 一般来说,如果我们列出一个对象,而它的后面又跟有由花括号包裹的参数列表,就像fun(arg1, arg2, …),这个对象就被称为函数对象。函数对象大致可分为…

大模型在肝硬化腹水风险预测及临床方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、肝硬化及大模型相关理论基础 2.1 肝硬化概述 2.2 大模型技术原理 2.3 大模型在医疗领域的应用现状 三、大模型预测肝硬化腹水术前风险 3.1 术前风险因素分析 3.2 大模型预测术前…

MCP:如何通过模型控制推理助力AI模型实现“深度思考”?

MCP:如何通过模型控制推理助力AI模型实现“深度思考”? | Echo_Wish专栏 大家好,我是Echo_Wish,一个在人工智能和Python领域深耕的技术达人。今天咱们聊一个相对前沿的技术话题——MCP (Model Control Propagation),它是如何帮助AI模型“深度思考”,让机器变得更加智能的…

c++初识

C 基础入门 本人写了很多c的服务器和客户端代码,这篇文章主要是想帮助初学者快速入门c.这样就能快速阅读我的源码,其实不难c只是比c多了些特性,其实不难,你们就理解为有更多的方式修改函数和调用函数的方式和重写函数 C 基础入门…

JVM 生产环境问题定位与解决实战(八):实战篇——正则表达式回溯引发的CPU 100%

本文已收录于《JVM生产环境问题定位与解决实战》专栏,完整系列见文末目录 1. 引言 在上一篇文章中,我们深入剖析了OSSClient泄漏引发的FullGC风暴全链路排查过程。本文聚焦另一个经典线上问题——正则表达式回溯导致的CPU 100%。在Java应用中&#xff0…

100天精通Python挑战总览 | 零基础到应用实战!

目录 ✨ 为什么发起100天挑战?✨整体学习路线规划第一阶段|基础篇(第1天 - 第50天)第二阶段|应用篇(第51天 - 第100天)Web开发篇爬虫篇数据分析篇AI入门篇 🏆为什么这么划分&#xf…

C++编译之(5)-cmake/CMakeLists.txt的编译使用教程

C++编译之(5)-cmake/CMakeLists.txt的编译使用教程 上一节,点这里 1、如何查看cmake的配置参数 那么如何查看当前配置的参数呢,我们可以使用-L参数 cmake .. -L # cmake .. -LAH完全使用命令行,则可以通过多次重复使用cmake … -DOPTION1=ON -D OPTION2=ON配置制定选项;并…

2025五一杯数学建模竞赛思路助攻预定

2025五一杯数学建模竞赛思路助攻预定(思路内容见文末名片) 一、概况 数学建模竞赛是一项模拟面对实际问题寻求解决方案的活动,是一次近似 于“真刀真枪”的创新探索性实践训练。在丰富并活跃学生课外生活活动的同 时,数学建模竞…

2025年绿色材料与制造技术国际学术会议(GMMT 2025)

重要信息 时间:2025年6月23-25日(英国时间) 地点:英国剑桥线下会场中国线上分会场 官网:www.icgmmt.com 部分 征稿主题 可生物降解材料垃圾和废物的资源化绿色涂料与涂层 生物基聚合物的合成与应用 自然纤维增强复…

鸿蒙NEXT开发正则工具类RegexUtil(ArkTs)

import { FormatUtil } from ./FormatUtil;/*** 正则工具类* author CSDN-鸿蒙布道师* since 2025/04/27*/ export class RegexUtil {/*** 英文字母、数字和下划线*/static readonly REG_GENERAL "^\\w$";/*** 数字*/static readonly REG_NUMBERS "^\\d$"…

Spring系列六:JdbcTemplate

JdbcTemplate 🦒看一个实际需求🦒官方文档🦒基本介绍🦒使用实例📕需求说明📕代码演示 🦒看一个实际需求 实际需求: 如果程序员就希望使用spring框架来做项目, spring框架如何处理对数据库的操作…

来聊聊JVM中安全点的概念

文章目录 写在文章开头详解safepoint基本概念什么是安全点?为什么需要安全点JVM如何让线程跑到最近的安全点线程什么时候需要进入安全点JVM如何保证线程高效进入安全点如何设置安全点用一次GC解释基于安全点的STW实践-基于主线程休眠了解安全点的工作过程代码示例基于日志印证…

搭建 Spark YARN 模式集群指南

在大数据处理领域,Apache Spark 凭借其卓越的性能和易用性广受青睐。而 YARN(Yet Another Resource Negotiator)作为 Hadoop 的资源管理框架,能高效管理集群资源。将 Spark 与 YARN 结合,以 YARN 模式搭建集群&#xf…

WPF之Label控件详解

文章目录 1. 引言2. Label控件基础2.1 类继承结构2.2 Label类定义 3. Label控件的核心属性3.1 Content属性3.2 Target属性3.3 其他常用属性 4. 标签样式与模板自定义4.1 简单样式设置4.2 使用Style对象4.3 触发器使用4.4 使用ControlTemplate完全自定义 5. Label与表单控件交互…

一种改进的YOLOv11网络,用于无人机视角下的小目标检测

大家读完觉得有帮助记得关注和点赞!!! 摘要 随着无人机(UAV)和计算机视觉技术的快速发展,从无人机视角进行目标检测已成为一个重要的研究领域。然而,无人机图像中目标像素占比极小、物体尺度变…