如何在给定ThreadInfo对象的情况下中断()一个线程?

时间:2015-10-20 09:47:23

标签: java multithreading

我有一种情况,我需要在应用程序运行时进行一些线程清理。 (这反过来主要是由于图书馆的设计选择,不幸的是,这是我无法控制的。)

我无权访问任何相关的java.lang.Thread实例,因为该线程是在我的代码控件之外创建的。这意味着,例如Java Thread Primitive DeprecationHow to Stop a ThreadHow can I interrupt a thread created from within a method?建议的简单方法对我没有帮助,因为它们都依赖于Thread实例可用或者是可以提供。

执行但是有(全新的)代码调用ThreadMXBean.dumpAllThreads(),返回ThreadInfo []。这看起来是一个很好的清理起点,因为返回的数组为我提供了确定需要清理哪些特定线程(如果有的话)所需的所有信息。

据我所知,我想做的是致电Thread.interrupt()。请参阅示例How exactly do I interrupt a thread?。这个问题是,如果只有一个ThreadInfo对象,我似乎无法找到任何方法。

如上所述,我准备陈述这个问题:

如何从ThreadInfo对象获取相应的Thread对象,以便我可以在Thread对象实例上调用方法?

或者, 在只给出描述该线程的ThreadInfo对象的线程上有效调用Thread.interrupt()的其他方法是什么?

理想情况下,建议的解决方案应该适用于Java 7和Java 8.它们需要使用Java 8。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

在ThreadInfo中,您拥有线程ID,因此您可以使用它来获取对线程的引用。

阅读此question有关如何操作的信息。

我会做这样的事情:

ThreadInfo[] threadInfos = ....;
Set<Long> tIds = new HashSet<>();
for (ThreadInfo tIndo : threadInfos) {
  tIds.add(tIndo.getId());
}
for (Thread t : Thread.getAllStackTraces().keySet()) {
  if(tIds.contains(t.getId()) {
    t.interrupt();
  }
}