必须通过 thread 子类实例调用 start() 启动线程,该方法是实例方法、不可重复调用、不能在构造器中调用,且与直接调用 run() 有本质区别:前者创建新线程,后者仅同步执行。

继承 Thread 类后,不能直接调用 start() 方法启动线程,除非你已正确创建该类的实例并确保没有重复调用或在错误状态下调用。
必须通过实例调用 start()
Java 中 start() 是 Thread 类的实例方法,不是静态方法。你需要先创建子类对象,再调用它的 start():
- 定义一个继承
Thread的类,并重写run()方法 - 用
new创建该类的对象 - 对这个对象调用
start()
例如:
class MyThread extends Thread {
public void run() {
System.out.println("线程正在运行");
}
}
// 启动方式:
MyThread t = new MyThread();
t.start(); // ✅ 正确:通过实例调用
不能在构造方法里自动调用 start()
有些初学者会在构造方法中直接写 this.start(),这会导致线程在对象尚未完全初始化时就启动,容易出错甚至抛出 IllegalThreadStateException:
- 构造方法中调用
start()属于“过早发布”,不安全 - 线程状态此时为
NEW,但构造过程未完成,可能引发不可预测行为 - 应由外部代码控制启动时机
start() 只能调用一次
同一个线程对象多次调用 start() 会抛出 IllegalThreadStateException:
- 线程启动后状态变为
RUNNABLE或后续状态,再次调用start()无效 - 若需多次执行任务,应新建线程实例,或改用
Runnable+ 线程池
错误示例:
MyThread t = new MyThread(); t.start(); // ✅ 第一次 t.start(); // ❌ 抛异常:IllegalThreadStateException
注意 run() 和 start() 的区别
常见误区是误把 run() 当作启动方法:
- 直接调用
t.run()只是在当前线程同步执行,不会开启新线程 - 只有
t.start()才真正触发 JVM 创建新线程并调度执行run()
所以务必区分清楚:启动线程用 start(),定义逻辑用 run()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











