推荐方式是实现Runnable接口配合多个Thread实例调用start(),解耦任务与调度;也可继承Thread类或用Lambda简化,但须避免调用run()、注意线程安全及输出不确定性。

启动多个并发子线程,关键不是“创建多少个对象”,而是让每个线程真正独立运行、互不阻塞。Java 中最常用且推荐的方式是通过 实现 Runnable 接口 + 多个 Thread 实例,配合 start() 方法触发并发执行。
用 Runnable 启动多个子线程(推荐)
这种方式解耦了“任务逻辑”和“线程调度”,支持复用任务、避免单继承限制,也更贴近真实开发习惯。
- 定义一个类实现
Runnable,在run()里写你要并发执行的代码 - 为每个子线程新建一个
Thread对象,把同一个或不同Runnable实例传进去 - 对每个
Thread调用start()—— 这才是开启新线程的唯一正确方式 - 不要调用
run(),那只是普通方法调用,仍在主线程中顺序执行
用 Thread 子类启动多个子线程(基础但有局限)
适合快速验证或教学演示,但因 Java 是单继承,一旦继承了 Thread 就无法再继承其他类,扩展性差。
- 自定义类继承
Thread,重写run() - 创建多个该类的实例(如
new MyThread("A")、new MyThread("B")) - 分别调用
start(),每个实例都会在独立线程中运行自己的run() - 注意:不能重复调用
start(),否则抛IllegalThreadStateException
用 Lambda 表达式简化启动(Java 8+)
适合逻辑简单、无需复用的任务,代码更紧凑。
立即学习“Java免费学习笔记(深入)”;
- 直接传入 Lambda 到
Thread构造器:new Thread(() -> { System.out.println("线程运行中"); }).start(); - 可连续启动多个:
new Thread(...).start(); new Thread(...).start(); - 本质仍是基于
Runnable,只是语法糖,不影响并发行为
常见误区与注意事项
并发是否生效,不看代码写了几个 Thread,而看是否都调用了 start() 并实际进入就绪/运行状态。
-
绝对不要用
run()替代start():它不会开新线程,所有逻辑仍在当前线程串行执行 - 多个线程共用同一份数据时(比如共享变量),必须考虑线程安全问题,否则结果不可预测
- 主线程结束不影响子线程继续运行(除非子线程被设为守护线程
setDaemon(true)) - 输出顺序是随机的——这是并发的正常表现,不代表代码出错


















