必须通过 thread 实例调用 start() 启动线程,且仅限新建状态(new)下调用一次;直接调用 run() 或在非 thread 对象上调用 start() 均无效。

不能直接调用 start() 方法来“启动线程”,除非你已经正确创建并准备好了 Thread 对象——这是常见误解的源头。真正关键的是:必须基于 Thread 类(或其子类)的实例调用 start(),且该线程尚未启动、未终止、也未被中断过。
确保线程对象已正确创建
Java 中启动线程的前提是拥有一个合法的 Thread 实例。常见方式有两种:
- 继承
Thread类,重写run()方法,然后创建子类实例 - 实现
Runnable接口,将其实例传入Thread构造器
错误示例:直接调用普通对象的 start()(比如自己写的类里加了个叫 start() 的方法),这不会启动任何线程,只是普通方法调用。
调用 start() 的正确时机和限制
start() 只能调用一次,且只能在“新建状态(NEW)”下调用。一旦调用成功,JVM 会为该线程分配资源、调用 run(),线程进入就绪或运行状态。
- 重复调用会抛出
IllegalThreadStateException - 对已死亡(terminated)或已启动过的线程再次调用无效
- 不能在
run()执行中或执行后再次调用
别把 run() 和 start() 混了
直接调用 run() 不会启动新线程,它只是在当前线程中同步执行方法体,等同于普通方法调用。
正确做法示例:
Runnable task = () -> System.out.println("Hello from thread!");
Thread t = new Thread(task);
t.start(); // ✅ 启动新线程
// t.run(); // ❌ 只是在主线程里执行,不启新线程
检查线程状态再操作(可选但推荐)
调试或关键逻辑中,可用 getState() 判断是否适合启动:
-
t.getState() == Thread.State.NEW表示可以安全调用start() - 其他状态(如
RUNNABLE、TERMINATED)则不应再调用
注意:状态检查和 start() 之间存在微小时间窗口,生产环境一般不依赖此判断做控制流,而是靠设计保证单次调用。










