Java如何实现多线程 Java创建线程的四种方式【教程】
发布时间 - 2026-01-31 00:00:00 点击率:次Java创建线程有四种方式:继承Thread类、实现Runnable接口、实现Callable配合FutureTask、使用线程池;关键均需调用start()或submit()触发调度,否则不真正启动线程。
Java里创建线程不是只有 new Thread() 一种方式,但也不是所有“看起来像创建线程”的写法都真正起效——关键看是否调用了 start(),以及是否绕过了线程调度机制。
直接继承 Thread 类:最直白但有单继承限制
这是初学者最容易上手的方式,但 Java 不支持多继承,一旦类已继承其他父类(比如 MyService extends BaseService),就无法再 extends Thread。
常见错误是写了 run() 却调用 run() 而非 start():这不会开启新线程,只是在当前线程同步执行方法体。
- 必须重写
run()方法,不能改名或加参数 - 启动必须用
thread.start(),不是thread.run() - 多个
Thread实例之间不共享状态,适合隔离任务
实现 Runnable 接口:推荐的轻量级方案
比继承更灵活,适用于已有继承体系的类;也是 ThreadPoolExecutor 底层接受的任务类型。注意它本身不表示线程,只是“可被线程执行的任务”。
容易混淆的点:把 Runnable 实例直接传给 Thread 构造器没问题,但若误传给 FutureTask 或线程池时没包装好,会编译失败或运行时报 ClassCastException。
-
new Thread(new MyTask()).start()是合法组合 - Lambda 表达式可简化为
() -> { /* logic */ },但要注意闭包变量的线程安全性 - 无法从
run()返回值,如需结果请用Callable
实现 Callable + FutureTask:需要返回值和异常处理的场景
Callable 和 Runnable 的核心区别是:支持泛型返回值、声明受检异常。但它不能直接交给 Thread,必须包装成 FutureTask(它同时实现了 Runnable 和 Future)。
典型坑:调用 future.get() 会阻塞当前线程,如果没设超时,可能卡死;另外 FutureTask 只能 run() 一次,重复调用无效。
-
new FutureTask(new MyCallable())后,仍需用new Thread(task).start() - 线程池中建议直接提交
Callable,由ExecutorService.submit()自动包装 - 异常不会在子线程打印,必须通过
get()捕获ExecutionException
使用线程池(ExecutorService):生产环境唯一合理的选择
手动 new Thread() 在高并发下极易 OOM(线程栈内存耗尽)

Executors 工厂方法只是快捷入口,真正要控制资源必须用 ThreadPoolExecutor 构造函数。
很多人用 Executors.newCachedThreadPool() 处理短任务,却忽略它默认的 60s 空闲存活时间,在突发流量后线程不回收,长期占用资源。
- 避免使用
Executors.newFixedThreadPool(10)—— 它内部用无界队列,任务积压会导致内存溢出 - 自定义线程池务必指定
BlockingQueue容量、RejectedExecutionHandler策略 -
submit(Runnable)返回Future>,submit(Callable)返回Future
真正难的不是写出四种写法,而是理解每种背后的调度模型、生命周期管理和资源边界。比如 FutureTask 的状态机、线程池的 corePoolSize 与 maximumPoolSize 如何联动、甚至 ThreadLocal 在线程复用场景下的残留风险——这些才是上线前必须验证清楚的部分。
# java
# 栈
# 区别
# 父类
# 构造函数
# Lambda
# 继承
# 多继承
# 接口
# 泛型
# 线程
# 多线程
# Thread
# 闭包
# 并发
# 返回值
# 四种
# 这是
# 多个
# 才是
# 已有
# 很多人
# 适用于
# 会在
# 但也
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Linux系统运维自动化项目教程_Ansible批量管理实战
JavaScript如何操作视频_媒体API怎么控制播放
如何在IIS中新建站点并配置端口与IP地址?
如何快速搭建高效WAP手机网站?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
javascript中闭包概念与用法深入理解
javascript中的try catch异常捕获机制用法分析
Laravel PHP版本要求一览_Laravel各版本环境要求对照
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
浅谈redis在项目中的应用
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Laravel如何为API编写文档_Laravel API文档生成与维护方法
如何注册花生壳免费域名并搭建个人网站?
JavaScript中的标签模板是什么_它如何扩展字符串功能
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
JS经典正则表达式笔试题汇总
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Bootstrap CSS布局之列表
深圳网站制作平台,深圳市做网站好的公司有哪些?
千库网官网入口推荐 千库网设计创意平台入口
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
如何在IIS服务器上快速部署高效网站?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
装修招标网站设计制作流程,装修招标流程?
网站建设要注意的标准 促进网站用户好感度!
南京网站制作费用,南京远驱官方网站?
C#如何调用原生C++ COM对象详解
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Android Socket接口实现即时通讯实例代码
如何在橙子建站中快速调整背景颜色?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
Laravel如何生成API文档?(Swagger/OpenAPI教程)
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
微信小程序 闭包写法详细介绍
如何快速生成高效建站系统源代码?
,南京靠谱的征婚网站?
香港服务器WordPress建站指南:SEO优化与高效部署策略

