Java创建线程主要有三种方式:继承Thread类、实现Runnable接口、使用Callable和FutureTask;前两种最常用,第三种适用于需获取执行结果的场景;实际开发推荐Runnable配合线程池使用。

Java中创建线程主要有三种方式:继承Thread类、实现Runnable接口、使用Callable和FutureTask。其中前两种最常用,第三种适用于需要获取执行结果的场景。
继承Thread类创建线程
通过自定义类继承Thread,重写run()方法,在其中编写线程要执行的逻辑,然后调用start()启动线程。
- 优点:写法直观,适合简单任务
- 缺点:Java不支持多继承,继承
Thread后无法再继承其他类 - 注意:
run()是普通方法,直接调用不会开启新线程;必须调用start()才真正启动线程
实现Runnable接口创建线程
定义一个类实现Runnable接口,实现run()方法,再将其实例传入Thread构造器,最后调用start()。
- 优点:避免单继承限制,更符合面向对象设计原则(组合优于继承)
- 适合多个线程共享同一份任务逻辑,比如多个线程处理同一个
Runnable实例 - 实际开发中更推荐这种方式,尤其配合线程池使用
使用Callable和FutureTask获取线程执行结果
Callable接口与Runnable类似,但call()方法可以有返回值,并能抛出受检异常。FutureTask是Runnable和Future的实现类,可包装Callable对象并提交给线程执行。
立即学习“Java免费学习笔记(深入)”;
- 适用场景:需要知道线程执行是否完成、获取返回值或取消任务
- 不能直接传给
Thread构造器,需通过FutureTask适配 - 常用于
ExecutorService中,如submit(Callable)返回Future
补充说明:线程池方式(推荐生产环境使用)
虽然不算“原始创建方式”,但实际项目中应优先使用ExecutorService(如Executors.newFixedThreadPool())来管理线程。它复用线程、控制并发数、避免频繁创建销毁开销。
- 提交
Runnable或Callable任务,由线程池统一调度 - 比手动
new Thread().start()更安全、高效、可控 - 配合
Future可灵活管理异步任务生命周期
不复杂但容易忽略:无论哪种方式,都要注意线程安全问题,尤其是共享变量的访问控制。










