根据线程id获取线程对象的方法

251 阅读1分钟

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();  

# 欢迎补充