0

0

在Java里Runnable接口如何创建线程_Java线程任务定义说明

P粉602998670

P粉602998670

发布时间:2026-02-07 14:59:02

|

541人浏览过

|

来源于php中文网

原创

Runnable本身不创建线程,需通过Thread.start()或线程池执行;调用run()仅在当前线程运行,无并发效果;主流用法为Thread包裹、线程池提交、Lambda简写;Callable支持返回值和受检异常,返回Future;需注意共享变量同步、非线程安全对象复用、线程池关闭及ThreadLocal上下文传递问题。

在java里runnable接口如何创建线程_java线程任务定义说明

直接用 Runnable 接口本身不能“创建线程”,它只定义任务;真正创建并启动线程,得靠 Thread 类或线程池。

为什么不能直接 new Thread(Runnable) 就算完事?

很多人写 new Thread(new MyRunnable()).run(),结果任务在主线程执行、毫无并发效果——因为调用了 run() 而非 start()

  • run() 是普通方法,谁调用就在谁的线程里执行
  • start() 才触发 JVM 开新线程,并在新线程中自动调用 run()
  • 重复调用 start() 会抛 IllegalThreadStateException

三种主流用法及适用场景

实际开发中,Runnable 几乎不会单独出现,而是配合具体执行机制:

  • 手动管理:用 Thread 包裹后调用 start() —— 适合简单、一次性、低频任务(如 GUI 初始化回调)
  • 线程池提交:executor.submit(runnable)executor.execute(runnable) —— 绝大多数业务场景首选,复用线程、避免资源泄漏
  • Lambda 简写:executor.execute(() -> { /* do something */ }); —— JDK 8+ 后,只要 Runnable 只有一个抽象方法,就能用 lambda,本质仍是 Runnable 实例

Runnable 和 Callable 的关键区别在哪?

如果任务需要返回值或抛受检异常,Runnable 就不够用了:

立即学习Java免费学习笔记(深入)”;

影谱
影谱

汉语电影AI辅助创作平台

下载
  • Runnable.run() 返回 void,且不能声明抛出受检异常(如 IOException
  • Callable.call() 返回泛型 V,可声明抛出任意异常
  • 线程池对两者支持不同:execute() 只接受 Runnablesubmit() 两个都收,但传 Callable 会返回 Future

例如:Future f = executor.submit(() -> "done"); —— 这个 "done" 就是 call() 的返回值,而 Runnable 做不到这点。

容易被忽略的生命周期与状态问题

Runnable 实例本身无状态,但它的执行上下文有。常见疏漏:

  • 共享变量没加同步或用 volatile,导致多线程读写错乱
  • 把非线程安全对象(如 SimpleDateFormat)作为 Runnable 成员复用,引发格式化异常
  • 线程池 shutdown 后仍提交任务,抛 RejectedExecutionException,需检查 isShutdown() 或用 try-catch

最麻烦的是:任务逻辑里隐式依赖了 ThreadLocal 或当前线程身份(比如日志 MDC),换线程执行就丢上下文——这种必须显式传递或重置。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

606

2023.08.02

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

107

2025.11.27

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

69

2025.10.23

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

211

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

58

2026.01.05

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1297

2023.10.19

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.8万人学习

Java 教程
Java 教程

共578课时 | 59.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号