从其ID获取对Thread对象的引用

如果我知道与该线程关联的ID,我怎样才能获得对正在运行的线程的引用?

例如

long threadID = 12342; Thread thread = (What goes here?) getThreadFromId(threadID); //I know this is totally made up 

你有两种方法可以做到这一点。 两者都很简单:

  • 旧方法:获取根线程组,您可以在循环中访问Thread.currentThread().getGroup() .. getParent()。 并调用enumerate(Thread[])

  • 更新(虽然慢)。 for (Thread t : Thread.getAllStackTraces().keySet()) if (t.getId()==id)...

第一种方法有一个小问题,由于ThreadGroup.destroy()的错误,ThreadGroup可能根本不会枚举任何东西。

然而,第二个更慢,并且有安全漏洞。

您可以使用以下代码来获取线程名称(例如,我想获取处于死锁状态的线程的名称)

 ThreadMXBean threadMB = ManagementFactory.getThreadMXBean(); long threadIds[] = threadMB.findDeadlockedThreads(); for (long id : threadIds) { System.out.println("The deadLock Thread id is : " + id + " > " + threadMB.getThreadInfo(id).getThreadName()); }