jdk8方法
public static Thread getThreadByThreadId(long threadId) {
//1. **获取当前线程的线程组**:
ThreadGroup group = Thread.currentThread().getThreadGroup();
//使用一个`while`循环遍历线程组的层次结构。这从当前线程的线程组开始,并逐级向上遍历到整个系统线程组。
while (group != null) {
//在每个线程组级别,尝试预分配一个线程数组,大小为当前线程组的活动线程数的1.2倍。这样做是为了减少重新分配数组的次数,从而提高性能
Thread[] threads = new Thread[(int) (group.activeCount() * 1.2)];
//使用`group.enumerate(threads, true)`方法来枚举线程组中的所有线程。这将填充之前预分配的线程数组。
int count = group.enumerate(threads, true);
for (int i = 0; i < count; i++) {
if (threadId == threads[i].getId()) {
return threads[i];
}
}
//在遍历完当前线程组后,将`group`更新为其父线程组,以便继续向上遍历。
group=group.getParent();
}
//如果遍历完所有线程组后没有找到匹配的线程,则返回`null`。
return null;
}
jdk8以上
Thread方法直接获取
Thread thread = Thread.findThread(threadId);
ThreadMXBean获取
// 获取线程信息
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(new long[] {threadId}, true, true);
// 根据线程ID获取线程对象
Thread thread = threadInfos[0].getThread();
# 欢迎补充