我有一个名为“CreateThread”的Java类,它创建一个线程,每次实例化一个对象(即在构造函数中创建这个上层线程)。这一个线程又创建了三个其他线程。我可以创建'N'个对象。在第一级创建'N'个线程。我还将这个上层命名为“one”,“two”,“three”等线程。这些'N'线程创建了N * 3个线程。这个场景我能够实现。但是当我需要杀死/中断线程时会出现问题。
例如,名为“one”的Thread创建了另外三个线程'a','b'和'c'。如果我想杀死所有上述4个线程(一个,a,b和c),问题就出现了。我不知道如何实现这一目标。
杀死线程的调用来自另一个名为“KillThread”的类。由于我没有上面创建的任何线程的句柄,我无法杀死线程。我的意思是我想从一个没有引用线程的不同类中杀死所有4个线程。
非常感谢帮助解决上述情况。
谢谢,Rajath
答案 0 :(得分:2)
要杀死一个线程,你必须得到它的句柄。
执行此操作的一种简单方法是使用ExecutorService,您可以添加充当线程池的任务。要中断池中的所有线程,您可以调用executorService.shutdown();
并且所有正在运行的线程都将被中断。
答案 1 :(得分:1)
只需将创建的线程的引用存储在某处。主类可以维护N个线程的列表,每个N线程可以维护对它创建的a,b和c线程的引用。
答案 2 :(得分:0)
您可以存储参考文献(清洁解决方案)。
或者,如果你共享一个ThreadGroup,你可以这样破解:
// Find the root thread group
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
while (root.getParent() != null) {
root = root.getParent();
}
// Visit each thread group
visit(root, 0);
// This method recursively visits all thread groups under `group'.
public static void visit(ThreadGroup group, int level) {
// Get threads in `group'
int numThreads = group.activeCount();
Thread[] threads = new Thread[numThreads*2];
numThreads = group.enumerate(threads, false);
// Enumerate each thread in `group'
for (int i=0; i<numThreads; i++) {
// Get thread
Thread thread = threads[i];
}
// Get thread subgroups of `group'
int numGroups = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[numGroups*2];
numGroups = group.enumerate(groups, false);
// Recursively visit each subgroup
for (int i=0; i<numGroups; i++) {
visit(groups[i], level+1);
}
}
如果您可以识别线程(例如按线程名称),您可以杀死它们。我强烈建议第一个将引用存储在全局引用的树结构中的解决方案。