中断来自不同类的java线程

时间:2011-12-29 11:37:32

标签: java multithreading concurrency

我有一个名为“CreateThread”的Java类,它创建一个线程,每次实例化一个对象(即在构造函数中创建这个上层线程)。这一个线程又创建了三个其他线程。我可以创建'N'个对象。在第一级创建'N'个线程。我还将这个上层命名为“one”,“two”,“three”等线程。这些'N'线程创建了N * 3个线程。这个场景我能够实现。但是当我需要杀死/中断线程时会出现问题。

例如,名为“one”的Thread创建了另外三个线程'a','b'和'c'。如果我想杀死所有上述4个线程(一个,a,b和c),问题就出现了。我不知道如何实现这一目标。

杀死线程的调用来自另一个名为“KillThread”的类。由于我没有上面创建的任何线程的句柄,我无法杀死线程。我的意思是我想从一个没有引用线程的不同类中杀死所有4个线程。

非常感谢帮助解决上述情况。

谢谢,Rajath

3 个答案:

答案 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);
    }
}

如果您可以识别线程(例如按线程名称),您可以杀死它们。我强烈建议第一个将引用存储在全局引用的树结构中的解决方案。