Java中值得优先掌握的Thread常用方法共10个:start()、run()、sleep()、join()、interrupt()、currentThread()、setName()、isInterrupted()、interrupted()、getState();其中start()启动新线程,run()仅为普通方法,sleep()/join()/interrupt()属协作式控制,命名与当前线程获取用于调试,状态判断应避免轮询而用事件驱动。

Java 中 Thread 类真正常用、且在实际开发中值得优先掌握的方法,不超过 10 个;其余多数是过时、危险或极少直接调用的。
如何正确启动线程:只用 start(),绝不用 run()
这是最常踩的坑。调用 run() 不会开启新线程,只是在当前线程同步执行方法体,完全失去多线程意义。
-
start():触发 JVM 创建新线程,并自动调用该线程的run()方法 —— 这才是“启动” -
run():只是一个普通实例方法,可被任意调用,不涉及线程调度 - 重复调用
start()会抛出IllegalThreadStateException
Thread t = new Thread(() -> System.out.println("hello"));
t.start(); // ✅ 正确:新线程执行
// t.run(); // ❌ 串行执行,无并发效果
// t.start(); // ❌ 抛出 IllegalThreadStateException
线程状态控制:sleep()、join()、interrupt() 的真实作用
它们不“强制停止”线程,而是协作式通知或调度建议,语义和行为常被误解:
-
Thread.sleep(long):让当前线程暂停指定毫秒,期间释放 CPU,但不释放锁;可能被中断,抛出InterruptedException -
join():阻塞当前线程,直到目标线程终止;本质是“等待另一个线程结束”,不是“合并线程” -
interrupt():仅设置目标线程的中断标志位;若线程正阻塞在sleep()/wait()/join(),则提前唤醒并抛出InterruptedException;否则需手动检查isInterrupted()
⚠️ 没有安全、通用的“强行 kill 线程”方式 —— stop()、suspend() 等已被废弃且禁用。
立即学习“Java免费学习笔记(深入)”;
获取与命名线程:currentThread() 和 setName() 的实用场景
调试和日志追踪高度依赖清晰的线程标识:
-
Thread.currentThread()是唯一可靠获取“当前正在运行这段代码的线程对象”的方式 -
setName(String)应在线程启动前调用(启动后仍可设,但部分 JVM 实现可能忽略);推荐命名格式如"io-worker-1"、"batch-processor" - 线程默认名形如
"Thread-0",毫无业务含义,日志中无法区分
Thread t = new Thread(() -> {
System.out.println("Running in: " + Thread.currentThread().getName());
});
t.setName("data-loader");
t.start(); // 输出:Running in: data-loader
为什么不要用 isAlive() 或 getState() 做逻辑判断?
这两个方法返回的是**瞬时快照**,无法保证后续执行的安全性,极易引发竞态:
-
isAlive()返回true只表示“此刻还没死”,下一纳秒就可能终止 -
getState()返回枚举值(如RUNNABLE、WAITING),但状态切换由 JVM 调度器决定,用户无法控制或预测 - 试图靠轮询这些状态实现“等待线程完成”或“重试条件”,属于典型反模式;应改用
join()、CountDownLatch或Future
线程生命周期管理必须基于事件(如中断、完成通知),而非轮询状态。










