Java 多线程基础:Thread 类核心用法详解

一、线程创建

1. 继承 Thread 类(传统写法)

class MyThread extends Thread {  @Override  public void run() {  System.out.println("线程执行");  }  
}  
// 使用示例
MyThread t = new MyThread();  
t.start();  

缺点:Java 单继承限制,灵活性差。

2. 实现 Runnable 接口(解耦推荐)

class MyRunnable implements Runnable {  @Override  public void run() {  System.out.println("线程执行");  }  
}  
// 使用示例
Thread t = new Thread(new MyRunnable());  
t.start();  

优点:避免单继承问题,任务与线程解耦。

3. 匿名内部类(简化写法)

(1)继承 Thread 的匿名内部类

Thread t = new Thread() {  @Override  public void run() {  System.out.println("通过继承Thread的匿名内部类创建的线程");  }  
};  
t.start();  

特点

  • 直接继承 Thread,重写 run()
  • 缺点:无法再继承其他类,灵活性低。

(2)实现 Runnable 的匿名内部类

Thread t = new Thread(new Runnable() {  @Override  public void run() {  System.out.println("通过实现Runnable的匿名内部类创建的线程");  }  
});  
t.start();  

优点

  • 任务与线程解耦,保留继承能力。

(3)两种匿名内部类的对比

维度继承 Thread 的匿名类实现 Runnable 的匿名类
继承限制占用继承资格(无法继承其他类)无继承限制
代码灵活性低(任务与线程绑定)高(任务与线程解耦)
Lambda 支持不支持(需重写 run() 方法)支持(Runnable 是函数式接口)
推荐场景简单的一次性任务通用场景,尤其是需要解耦任务与线程时

4. Lambda 表达式(Java 8+ 推荐)

Thread t = new Thread(() -> System.out.println("线程执行"));  
t.start();  

优点:语法糖,简化 Runnable 匿名类写法。


二、线程中断

核心方法interrupt()

Thread t = new Thread(() -> {  while (!Thread.currentThread().isInterrupted()) {  System.out.println("运行中");  }  
});  
t.start();  
// 中断线程  
t.interrupt();  

关键点

  • interrupt() 设置中断标志位,需在代码中主动检查。
  • 若线程在 sleep()/wait() 中,调用 interrupt() 会抛出 InterruptedException,并清空中断标志
  • 处理中断的正确姿势
try {  Thread.sleep(1000);  
} catch (InterruptedException e) {  // 重置中断标志或退出线程  Thread.currentThread().interrupt();  break;  
}  

三、线程等待

核心方法join()

Thread t = new Thread(() -> {  System.out.println("子线程执行");  
});  
t.start();  
t.join();  // 主线程等待 t 执行完毕  
System.out.println("主线程继续");  

参数扩展

  • join(long millis):最多等待指定毫秒。
    适用场景:需要确保线程执行顺序(如线程B依赖线程A的结果)。

四、线程休眠

核心方法sleep()

Thread.sleep(1000);  // 休眠1秒,释放CPU  

特点

  • 不释放锁(与 wait() 不同)。
  • 让权:休眠期间不参与CPU调度。

五、获取线程实例

核心方法Thread.currentThread()

Thread t = Thread.currentThread();  
System.out.println("当前线程:" + t.getName());  

用途:在 Runnable 任务当中获取当前线程引用。


总结

  • 创建线程:优先使用 Runnable + Lambda。
  • 中断处理:检查标志位或捕获异常,确保资源释放。
  • 线程控制join() 协调执行顺序,sleep() 主动让权。
  • 最佳实践:避免继承 Thread,保持任务与线程解耦。

结语
多线程编程是提升程序性能的利器,但也像一把双刃剑——用得好,事半功倍;用不好,bug 丛生。通过本文,我们探讨了 Thread 类的核心用法,从线程创建、中断控制到协作与休眠,每一步都关乎程序的效率与稳定。

记住:优先选择 Runnable ** + Lambda**,让任务与线程解耦;谨慎处理线程安全,避免数据竞争的“暗坑”;善用 join()sleep(),在并发中寻求秩序。

如果你在实战中遇到过有趣的线程问题,或有更好的实践心得,欢迎在评论区分享——技术之路,唯有交流才能走得更远。🎯

愿你的代码在多线程的世界里,既快如闪电,又稳如磐石!

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

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

相关文章

Django 中时区的理解

背景 设置时区为北京时间 TIME_ZONE ‘Asia/Shanghai’ # 启用时区支持 USE_TZ True 这样设置的作用 前端 (实际上前端el-date-picker 显示的是当地时区的时间) Element组件转换后,我们是东八区,前端传给后端的时间为&…

C# 深入理解类(成员常量)

成员常量 成员常量类似前一章所述的局部常量,只是它们被声明在类声明中而不是方法内,如下面的 示例: 与局部常量类似,用于初始化成员肯量的值在编译时必须是可计算的,而且通常是一个预定 义简单类型或由它们组成的表达…

【深度学习】#12 计算机视觉

主要参考学习资料: 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李沐学AI 目录 目标检测锚框交并比(IoU)锚框标注真实边界框分配偏移量计算损失函数 非极大值抑制预测 多尺度目标检测单发多框检测(S…

MCP实战:在扣子空间用扣子工作流MCP,一句话生成儿童故事rap视频

扣子最近迎来重要更新,支持将扣子工作流一键发布成MCP,在扣子空间里使用。 这个功能非常有用,因为我有很多业务工作流是在扣子平台上做的,两者打通之后,就可以在扣子空间里直接通过对话方式调用扣子工作流了&#xff0…

Redis学习打卡-Day3-分布式ID生成策略、分布式锁

分布式 ID 当单机 MySQL 已经无法支撑系统的数据量时,就需要进行分库分表(推荐 Sharding-JDBC)。在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键全局唯一了。这个时候就需要生…

LabVIEW光谱信号仿真与数据处理

在光谱分析领域,LabVIEW 凭借其图形化编程、丰富函数库及强大数据处理能力,成为高效工具。本案例将介绍如何利用 LabVIEW 仿真光谱信号,并对实际采集的光谱数据进行处理,涵盖信号生成、数据采集、滤波、分析及显示等环节。 ​ 一…

nginx相关面试题30道

一、基础概念与核心特性 1. 什么是 Nginx?它的主要用途有哪些? 答案: Nginx 是一款高性能的开源 Web 服务器、反向代理服务器及负载均衡器,基于事件驱动的异步非阻塞架构,擅长处理高并发场景。 主要用途:…

数据库实验报告 数据定义操作 3

实验报告(第3次) 实验名称 数据定义操作 实验时间 10月12日1-2节 一、实验内容 1、本次实验是用sql语句创建库和表,语句是固定的,要求熟记这些sql语句。 二、源程序及主…

霍夫圆变换全面解析(OpenCV)

文章目录 一、霍夫圆变换基础1.1 霍夫圆变换概述1.2 圆的数学表达与参数化 二、霍夫圆变换算法实现2.1 标准霍夫圆变换算法流程2.2 参数空间的表示与优化 三、关键参数解析3.1 OpenCV中的HoughCircles参数3.2 参数调优策略 四、Python与OpenCV实现参考4.1 基本实现代码4.2 改进…

记录一次修改nacos安全问题导致服务调用出现404

1、nacos默认值修改 nacos.core.auth.plugin.nacos.token.secret.key**** nacos.core.auth.server.identity.key******** nacos.core.auth.server.identity.value************ 重启nacos, 这时候微服务的token认证会立即失效,等待自动重连认证或者手动重启服务 2、…

Python面试总结

hello,大家好,我是potato,我总结一下最近的面试遇到的问题~ 1.Python开发(软通动力) 自我介绍主要问了项目(YOLOv11)项目遇到的难点和解决方法is,列表和元组的区别Python多线程有什么问题?Pyt…

5.18 day24

知识点回顾: 元组可迭代对象os模块 作业:对自己电脑的不同文件夹利用今天学到的知识操作下,理解下os路径。 元组 元组的特点: 有序,可以重复,这一点和列表一样 元组中的元素不能修改,这一点…

Uniapp中小程序调用腾讯地图(获取定位地址)

1、先配置权限: 这是上图的代码: "permission": { "scope.userLocation": { "desc": "你的位置信息将用于小程序位置接口的效果展示" } } 第二步:写代码: //下面是uniapp的模版代码 主…

写spark程序数据计算( 数据库的计算,求和,汇总之类的)连接mysql数据库,写入计算结果

1. 添加依赖 在项目的 pom.xml&#xff08;Maven&#xff09;中添加以下依赖&#xff1a; xml <!-- Spark SQL --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0…

nginx服务器实验

1.实验要求 1&#xff09;在Nginx服务器上搭建LNMP服务&#xff0c;并且能够对外提供Discuz论坛服务。 在Web1、Web2服务器上搭建Tomcat 服务。 2&#xff09;为nginx服务配置虚拟主机&#xff0c;新增两个域名 www.kgc.com 和 www.benet.com&#xff0c;使用http://www.kgc.…

Spring Boot 与 RabbitMQ 的深度集成实践(一)

引言 ** 在当今的分布式系统架构中&#xff0c;随着业务复杂度的不断提升以及系统规模的持续扩张&#xff0c;如何实现系统组件之间高效、可靠的通信成为了关键问题。消息队列作为一种重要的中间件技术&#xff0c;应运而生并发挥着举足轻重的作用。 消息队列的核心价值在于其…

c++多线程debug

debug demo 命令行查看 ps -eLf|grep cam_det //查看当前运行的轻量级进程 ps -aux | grep 执行文件 //查看当前运行的进程 ps -aL | grep 执行文件 //查看当前运行的轻量级进程 pstree -p 主线程ID //查看主线程和新线程的关系 查看线程栈结构 pstack 线程ID 步骤&…

10.7 LangChain v0.3架构大升级:模块化设计+多阶段混合检索,开发效率飙升3倍!

LangChain v0.3 技术生态与未来发展 关键词:LangChain Chains, Agents 架构, Retrieval Strategy, LangGraph, 模块化设计 3. LangChain 项目:Chains, Agents, Retrieval Strategy LangChain v0.3 通过 Chains-Agents-Retrieval 三位一体的技术栈,构建起完整的大模型应用开…

分布式 ID 生成的五种方法:优缺点与适用场景

0.简介 在分布式系统中&#xff0c;生成全局唯一的id是一个常见的需求。由于分布式系统的特性&#xff08;多节点&#xff0c;网络分区&#xff0c;时钟不同步等&#xff09;&#xff0c;传统的单机ID生成方式不再适用&#xff0c;所以一些分布式生成方式应运而生&#xff0c;…

基于单片机路灯自动控制仪仿真设计

标题:基于单片机路灯自动控制仪仿真设计 内容:1.摘要 本设计旨在解决传统路灯控制方式效率低、能耗大的问题&#xff0c;开展了基于单片机的路灯自动控制仪仿真设计。采用单片机作为核心控制单元&#xff0c;结合光照传感器、时钟模块等硬件&#xff0c;运用相关软件进行编程和…