应使用thread.currentthread().getname()在run()中比对线程名以识别身份,需启动前显式命名;更推荐通过构造参数传入角色标识,实现逻辑与身份强绑定。

直接用 Thread.currentThread().getName() 获取当前线程名,再与预期名称比较即可精准判定身份。关键不是“怎么取名”,而是“如何在 run() 中可靠、无歧义地识别自己”。
确保线程名在启动前已明确设置
线程名默认由 JVM 分配(如 Thread-0),不可靠。必须在启动前显式命名:
- 构造时指定:
new Thread(() -> { /* run logic */ }, "Worker-A") - 或启动前调用:
thread.setName("Worker-B")(注意:必须在start()前调用,否则抛IllegalThreadStateException)
在 run() 内部用 currentThread().getName() 安全比对
Thread.getName() 是实例方法,但 this 在 Runnable 实现中不指向线程对象,而是指向 Runnable 实例——所以不能写 this.getName()。正确方式是:
String myName = Thread.currentThread().getName();- 用
equals()比较:if ("Worker-A".equals(myName)) { ... }(推荐用字面量在前,避免空指针)
避免依赖线程名做核心逻辑分支(谨慎使用场景)
线程名本质是调试/监控标识,非语义契约。若用于关键路径(如权限校验、路由分发),需额外保障:
- 禁止运行时修改名(
setName()可被任意代码调用) - 建议配合唯一 ID 或上下文绑定(如
InheritableThreadLocal存储角色标记) - 若多线程共用同一
Runnable实例,线程名是唯一可区分字段;但更健壮的做法是把身份信息作为构造参数传入
替代方案:用构造参数传递身份标识(更推荐)
比依赖线程名更清晰、可控:
new Thread(new Task("Worker-A"), "Worker-A")class Task implements Runnable { private final String role; Task(String role) { this.role = role; } public void run() { if ("Worker-A".equals(role)) { ... } } }
这样身份与逻辑强绑定,不依赖线程管理侧的命名操作,也不怕名字被意外覆盖。











