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:需要返回值和异常处理的场景

CallableRunnable 的核心区别是:支持泛型返回值、声明受检异常。但它不能直接交给 Thread,必须包装成 FutureTask(它同时实现了 RunnableFuture)。

典型坑:调用 future.get() 会阻塞当前线程,如果没设超时,可能卡死;另外 FutureTask 只能 run() 一次,重复调用无效。

  • new FutureTask(new MyCallable()) 后,仍需用 new Thread(task).start()
  • 线程池中建议直接提交 Callable,由 ExecutorService.submit() 自动包装
  • 异常不会在子线程打印,必须通过 get() 捕获 ExecutionException

使用线程池(ExecutorService):生产环境唯一合理的选择

手动 new Thread() 在高并发下极易 OOM(线程栈内存耗尽)

或上下文切换开销爆炸。JDK 提供的 Executors 工厂方法只是快捷入口,真正要控制资源必须用 ThreadPoolExecutor 构造函数。

很多人用 Executors.newCachedThreadPool() 处理短任务,却忽略它默认的 60s 空闲存活时间,在突发流量后线程不回收,长期占用资源。

  • 避免使用 Executors.newFixedThreadPool(10) —— 它内部用无界队列,任务积压会导致内存溢出
  • 自定义线程池务必指定 BlockingQueue 容量、RejectedExecutionHandler 策略
  • submit(Runnable) 返回 Future>submit(Callable) 返回 Future

真正难的不是写出四种写法,而是理解每种背后的调度模型、生命周期管理和资源边界。比如 FutureTask 的状态机、线程池的 corePoolSizemaximumPoolSize 如何联动、甚至 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优化与高效部署策略