我在JMX java中工作,我使用接口getAllThreadIds ()
的{{1}}方法获取所有线程ID,但我需要一种方法来终止给定ID的线程。
例如:
ThreadMXBean
请帮助我 感谢
答案 0 :(得分:9)
你可以试试这个:
public void printAllThreadIds() {
Thread currentThread = Thread.currentThread();
ThreadGroup threadGroup = getRootThreadGroup(currentThread);
int allActiveThreads = threadGroup.activeCount();
Thread[] allThreads = new Thread[allActiveThreads];
threadGroup.enumerate(allThreads);
for (int i = 0; i < allThreads.length; i++) {
Thread thread = allThreads[i];
long id = thread.getId();
System.out.println(id);
}
}
private static ThreadGroup getRootThreadGroup(Thread thread) {
ThreadGroup rootGroup = thread.getThreadGroup();
while (true) {
ThreadGroup parentGroup = rootGroup.getParent();
if (parentGroup == null) {
break;
}
rootGroup = parentGroup;
}
return rootGroup;
}
但你应该打断Thread
而不是stop
。
不推荐使用Thread.stop()
方法,因为它会立即杀死Thread
。因此,此Thread
当前更改的数据结构可能仍处于不一致状态。中断使线程有机会正常关闭。
答案 1 :(得分:2)
实际上没有什么好方法可以杀死java中的线程。使用了一个名为Thread.stop()的api,但它也被取消了。检查此链接以获取有关Thread.stop错误以及我们应如何停止线程的更多详细信息。
http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
获取线程ID对您没有帮助,您需要让线程对象引用设置一个标志来停止该线程。
答案 2 :(得分:2)
您可以使用此方法:
static Map<Thread,StackTraceElement[]> getAllStackTraces()
获取所有线程,然后按键遍历map并找到合适的线程。
但这是一种非常糟糕的方法。你打算如何阻止线程?使用void stop()
方法?我建议将Executor框架与中断机制结合使用。
答案 3 :(得分:2)
Thread.getAllStackTraces
返回所有活动线程Map<Thread,StackTraceElement[]>.
的所有堆栈跟踪。这些跟踪应该与ThreadMXBean返回的线程相同。您可以从此映射中提取线程并中断它们。请注意,Java中没有合法方法可以杀死线程。