java中Runnable接口是什么?基本概念、工作原理、优点、`Runnable`与`Thread`的对比、与`Callable`接口的对比、实际场景
Runnable
接口是Java提供的一种用于实现多线程的接口,通常用来定义任务的具体逻辑。与Thread
类不同,Runnable
接口只提供一种抽象方法run()
,没有任何与线程的生命周期、管理相关的功能。它的主要作用是与Thread
类或线程池(如ExecutorService
)配合,作为线程的任务载体,使任务与线程的执行分离,从而提高代码的灵活性和可维护性。
1. Runnable
接口的基本概念
1.1 什么是Runnable
接口
Runnable
接口:是一个函数式接口(自Java 8以来),仅定义了一个抽象方法run()
,该方法封装了线程任务的具体逻辑。通过实现Runnable
接口的run()
方法,开发者可以将业务逻辑封装在一个类中,并交由线程执行。- 线程和任务的分离:
Runnable
接口的引入实现了线程与任务的分离,任务逻辑与线程管理(如启动、停止)分开,解耦了线程控制与任务执行的关系。
1.2 Runnable
的层次结构
Runnable
接口直接继承自Object
,没有复杂的继承关系。
java.lang.Object└── java.lang.Runnable
2. Runnable
接口的工作原理
2.1 通过实现Runnable
创建线程
通过实现Runnable
接口,可以将任务逻辑放入run()
方法中,随后通过Thread
类或其他执行器(如线程池)来执行run()
中的任务。与继承Thread
类不同,Runnable
接口的实现方式更灵活,因为类可以同时实现其他接口或继承其他类。
2.2 示例代码
public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Runnable task is running.");}public static void main(String[] args) {MyRunnable task = new MyRunnable();Thread thread = new Thread(task); // 将任务传递给线程对象thread.start(); // 启动线程,线程开始执行run()方法中的任务}
}
在这个例子中:
MyRunnable
实现了Runnable
接口,并将任务逻辑放在run()
方法中。- 通过
Thread
类的构造方法,将MyRunnable
对象传递给Thread
实例,然后调用start()
方法来启动线程。
2.3 使用Lambda
表达式创建Runnable
任务
自Java 8开始,Runnable
成为了一个函数式接口,因此可以使用Lambda表达式来简化代码。
public class Main {public static void main(String[] args) {Runnable task = () -> System.out.println("Task running using lambda.");Thread thread = new Thread(task);thread.start();}
}
这种方式大大减少了样板代码,使得创建Runnable
任务更加简洁直观。
3. Runnable
接口的优点
3.1 任务与线程分离
- 代码复用性高:通过实现
Runnable
接口,任务的执行逻辑可以与线程分离,使得相同的任务可以由不同的线程执行,代码复用性提高。 - 避免类的多重继承问题:Java不支持多继承,因此如果类已经继承了其他类,无法再继承
Thread
类,而通过实现Runnable
接口,则可以解决这个问题。
3.2 适配线程池
- 高效线程管理:
Runnable
接口可以很好地与线程池(如ExecutorService
)配合使用,避免频繁地创建和销毁线程所带来的性能开销。
3.3 代码灵活性
- 灵活的实现方式:实现
Runnable
接口的类可以灵活地结合其他功能,如实现其他接口、继承其他类,避免因继承Thread
类带来的单一继承限制。
4. Runnable
与Thread
的对比
特性 | Runnable 接口 | Thread 类 |
---|---|---|
实现方式 | 通过实现接口 | 通过继承类 |
灵活性 | 更灵活,允许实现其他接口或继承其他类 | 限制较大,必须继承Thread |
任务与线程的解耦 | 任务逻辑与线程分离 | 任务逻辑与线程耦合在一起 |
资源利用 | 配合线程池使用效率更高 | 独立使用时频繁创建和销毁线程浪费资源 |
线程管理功能 | 依赖Thread 或执行器 | 自身具备线程管理功能 |
5. Runnable
与Callable
接口的对比
Java 5引入了Callable
接口,它与Runnable
接口类似,用于定义任务,但提供了更丰富的功能。主要区别如下:
特性 | Runnable 接口 | Callable 接口 |
---|---|---|
返回值 | 无返回值 (void ) | 可以返回任务执行结果 (V call() ) |
异常处理 | 不抛出受检异常 | 可以抛出受检异常 (Exception ) |
线程池支持 | 配合ExecutorService 执行 | 配合ExecutorService.submit() 执行,并返回Future 对象 |
5.1 Callable
示例代码
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {return 42; // 返回计算结果}public static void main(String[] args) throws Exception {ExecutorService executor = Executors.newSingleThreadExecutor();MyCallable task = new MyCallable();Future<Integer> future = executor.submit(task); // 提交任务并返回结果System.out.println("Result: " + future.get()); // 获取结果executor.shutdown();}
}
在此示例中,Callable
返回了计算结果42
,并通过Future
对象获取结果。相比Runnable
,Callable
更适合处理需要返回值的任务。
6. 使用Runnable
的实际场景
6.1 并行处理大规模任务
- 在大数据处理、文件处理或网络请求等场景中,可以使用多个线程并行处理任务。
Runnable
接口定义了任务的逻辑,而通过线程池来管理这些线程可以提高效率并避免资源浪费。
6.2 任务调度和定时执行
- 在Java中,常见的调度器如
ScheduledExecutorService
可以通过传递Runnable
任务,实现任务的定时执行。比如,在服务器环境中,定时刷新缓存或定期检查服务状态。
6.3 实现异步操作
Runnable
接口可以用于实现异步处理,如异步调用、事件处理、并发操作等。常见的场景有图形用户界面(GUI)编程中,通过异步任务避免阻塞主线程。
7. 总结
Runnable
接口提供了一种轻量、灵活的方式来实现任务的并发执行。通过实现Runnable
接口,可以将任务逻辑与线程管理分离,提高代码的可读性和可维护性。此外,Runnable
接口还可以与线程池、调度器等高级并发工具结合使用,进一步提高程序的执行效率和资源利用率。
相比于直接继承Thread
类,使用Runnable
接口是一种更灵活、更高效的多线程编程方式。通过Runnable
接口配合Thread
类或ExecutorService
,开发者能够在Java应用程序中更好地处理并发任务。
相关文章:
java中Runnable接口是什么?基本概念、工作原理、优点、`Runnable`与`Thread`的对比、与`Callable`接口的对比、实际场景
Runnable接口是Java提供的一种用于实现多线程的接口,通常用来定义任务的具体逻辑。与Thread类不同,Runnable接口只提供一种抽象方法run(),没有任何与线程的生命周期、管理相关的功能。它的主要作用是与Thread类或线程池(如Executo…...

Mybatis Plus连接使用ClickHouse也如此简单
通过阅读列式数据库ClickHouse官网,不难看出它有支持JDBC规范的驱动jar包,可以直接集成到Object Relational Mapping框架等,下面我用SpringBootMybatisPlus环境连接ClickHouse来演示一下 集成步骤 1.Maven引入ClickHouse提供的JDBC依赖 <…...

什么社交平台可以找到搭子?分享多款找搭子必备的人气软件
在这个丰富多彩的世界里,我们常常渴望有一个志同道合的搭子,一起分享生活的点滴,共同探索未知的领域。无论是追寻美食的舌尖之旅,还是踏上充满惊喜的旅途;无论是在健身房挥洒汗水…… 找到一个合适的搭子,都…...

STM32 RTC实时时钟 F407 寄存器
RTC介绍 STM32F1: RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。 即在F1系列,RTC的日历部分只有一个32位的寄存器 该寄存器直接存放 时间戳 的值,即࿱…...
矩阵等价、向量组等价、线性方程组同解与公共解的关系
矩阵等价 矩阵 A 、 B 等价 ⇔ 两矩阵秩相等 R ( A ) R ( B ) ⇔ 每个矩阵的行秩等于列秩,两个矩阵的行秩与列秩分别相等 ⇔ 若行满秩则列向量组等价 ⇔ 若列满秩则行向量组等价 \begin{align} 矩阵A、B等价\\ &\Leftrightarrow 两矩阵秩相等R(A)R(B)\\ &\…...

[Linux] Linux 进程程序替换
标题:[Linux] Linux 进程程序替换 个人主页水墨不写bug (图片来源于网络) 目录 O、前言 一、进程程序替换的直观现象(什么是进程程序替换?) 二、进程程序替换的原理 三、进程程序替换的函数(…...

【Linux系统编程】第三十一弹---深入理解静态库:从零开始制作与高效使用的完全指南
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、静态库 1.1、怎么做静态库 1.2、怎么使用静态库 1、静态库 1.1、怎么做静态库 在Linux环境下,通常使用GCC&am…...

FFmpeg 简介及其下载安装步骤
目录 一、FFmpeg 简介 二、FFmpeg 安装步骤 2.1 打开官网 2.2 选择FFmpeg系统版本 2.3 下载FFmpeg压缩包 2.4 将下载好的压缩包进行解压 2.5 设置环境变量 2.5.1 在搜索栏中搜索【环境变量】,然后单击将其打开 2.5.2 找到系统变量中的【Path】,点…...

使用CSS+SVG实现加载动画
使用CSSSVG实现加载动画 效果展示 CSS知识点 SVG元素使用SVG相关CSS属性运用 整体页面布局 <section><div class"box"><div class"loader"><svg><circle cx"40" cy"40" r"40"></circl…...
物联网(IoT)的未来发展:智能互联时代的到来
物联网(IoT)的未来发展:智能互联时代的到来 物联网(IoT)正在迅速改变我们与世界互动的方式。无论是智能家居、智慧城市,还是工业自动化,物联网技术通过设备互联、数据采集和智能控制࿰…...

斯坦福 CS229 I 机器学习 I 构建大型语言模型 (LLMs)
1. Pretraining -> GPT3 1.1. Task & loss 1.1.1. 训练 LLMs 时的关键点 对于 LLMs 的训练来说,Architecture(架构)、Training algorithm/loss(训练算法/损失函数)、Data(数据)、Evalu…...

Java->排序
目录 一、排序 1.概念 2.常见的排序算法 二、常见排序算法的实现 1.插入排序 1.1直接插入排序 1.2希尔排序(缩小增量法) 1.3直接插入排序和希尔排序的耗时比较 2.选择排序 2.1直接选择排序 2.2堆排序 2.3直接选择排序与堆排序的耗时比较 3.交换排序 3.1冒泡排序…...
linux 大小写转换
var"TM_card_INFo" # 把变量中的第一个字符换成大写 echo ${var^} # 把变量中的所有小写字母,全部替换为大写 echo ${var^^} # 把变量中的第一个字符换成小写 echo ${var,} # 把变量中的所有大写字母,全部替换为小写 echo ${var,,} 参考…...

Linux——传输层协议
目录 一再谈端口号 1端口号范围划分 2两个问题 3理解进程与端口号的关系 二UDP协议 1格式 2特点 3进一步理解 3.1关于UDP报头 3.2关于报文 4基于UDP的应用层协议 三TCP协议 1格式 2TCP基本通信 2.1关于可靠性 2.2TCP通信模式 3超时重传 4连接管理 4.1建立…...
centos系列,yum部署jenkins2.479.1,2024年长期支持版本
centos系列,yum部署jenkins2.479.1,2024年长期支持版本 0、介绍 注意:jenkins建议安装LTS长期支持版本,而不是安装每周更新版本,jenkins安装指定版本 openjdk官网下载 Index of /jenkins/redhat-stable/ | 清华大学开…...

正则表达式-“三剑客”(grep、sed、awk)
1.3正则表达式 正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串,将匹配的子串替换或者从某个串中取出符号某个条件的子串等,在linux中代表自定义的模式模版,linux工具可以用正则表达式过滤文本。Linux…...

数智时代的新航向:The Open Group 2024生态系统架构·可持续发展年度大会邀您共筑AI数字新时代
在全球可持续发展和数字化转型双重驱动下,企业正面临着前所未有的挑战与机遇。如何在激烈的市场竞争中,实现业务增长的同时,履行社会责任,达成可持续发展的目标?The Open Group 2024生态系统架构可持续发展年度大会将于…...
TensorFlow 的核心概念
TensorFlow 是一个开源的机器学习框架,由 Google 开发和维护。它提供了一个强大的工具集,用于构建和训练各种机器学习模型。 TensorFlow 的核心概念是计算图(Computational Graph)。计算图由节点(Nodes)和…...

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(动态新增、修改等操作)
SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(动态新增、修改等操作) 前言数据库脚本创建需要被调度的方法创建相关实体类创建业务层接口创建业务层实现类控制层类测试结果 前言 我这边的SpringBoot的版本为2…...

Matlab详细学习教程 MATLAB使用教程与知识点总结
Matlab语言教程 章节目录 一、Matlab简介与基础操作 二、变量与数据类型 三、矩阵与数组操作 四、基本数学运算与函数 五、图形绘制与数据可视化 六、控制流与逻辑运算 七、脚本与函数编写 八、数据导入与导出 九、Matlab应用实例分析 一、Matlab简介与基础操作 重点内容知识…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...