java创建线程的4种主流方式中,最推荐的是实现runnable接口、实现callable接口+future、使用线程池;继承thread类虽基础但受单继承限制,后三种在解耦性、扩展性、返回值支持和资源管理上更优。

继承 Thread 类(基础但局限)
定义一个类继承 Thread,重写 run() 方法,在其中编写线程逻辑;创建实例后调用 start() 启动。
- 调用 start() 才真正启动新线程;直接调用 run() 只是普通方法执行,不会并发
- 优点:写法直观,
this就是当前线程对象,可直接调用getName()、sleep()等 - 缺点:受 Java 单继承限制,无法再继承其他类;任务与线程强绑定,不便于复用和线程池集成
实现 Runnable 接口(最常用)
定义一个类实现 Runnable 接口,重写 run() 方法;将该对象作为参数传入 Thread 构造器,再调用 start()。
- 任务(Runnable)和执行者(Thread)分离,符合“单一职责”原则
- 支持多线程共用同一任务实例(比如多个 Thread 执行同一个 Runnable)
- 可轻松适配线程池:
ExecutorService.submit(Runnable) - run() 方法无返回值,不能抛出受检异常
实现 Callable 接口 + Future 获取结果
定义类实现 Callable
- 适用于需要异步计算并获取返回值的场景(如远程调用、耗时计算)
- call() 方法声明抛出
Exception,比 run() 更健壮 - 必须配合线程池或
FutureTask使用,不能直接传给 Thread 构造器
使用线程池(生产首选)
通过 Executors 工具类创建线程池(如 newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor),再用 submit() 或 execute() 提交任务。
- 避免频繁创建/销毁线程的开销,提升性能和稳定性
- 统一管理线程生命周期、拒绝策略、队列容量等参数
- 天然兼容 Runnable 和 Callable,也支持
Runnable + 返回值包装形式 - 推荐使用
ThreadPoolExecutor显式构造,而非 Executors 的快捷工厂(防内存溢出风险)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











