Прервать поток Java из другого класса - PullRequest
1 голос
/ 29 декабря 2011

У меня есть класс Java под названием «CreateThread», который создает один поток каждый раз, когда создается экземпляр объекта (то есть этот поток верхнего уровня создается в конструкторе). Этот один поток в свою очередь создает три других потока. Я могу создать «N» количество объектов. На первом уровне 'N' количество потоков создается. Я также называю этот верхний уровень потоками как «один», «два», «три» и т. Д. Эти «N» потоки создали N * 3 потоков. Этот сценарий я могу реализовать. Однако проблема возникает, когда мне нужно убить / прервать потоки.

Например, поток с именем "one" создал три других потока: "a", "b" и "c". Если я хочу уничтожить все 4 вышеупомянутых потока (один, a, b и c), проблема возникает. Я понятия не имею, как этого можно достичь.

Призыв уничтожить поток поступает из другого класса с именем "KillThread". Поскольку у меня нет дескриптора ни к одному из потоков, созданных выше, я не могу уничтожить потоки. Я имею в виду, что я хочу уничтожить все 4 потока из другого класса, который не имеет ссылки на потоки.

Помощь в решении вышеуказанного сценария очень ценится.

Спасибо, Раджат

Ответы [ 3 ]

2 голосов
/ 29 декабря 2011

Чтобы убить нить, вы должны получить ручку к ней.

Простой способ сделать это - иметь ExecutorService, в который вы добавляете задачи, в которые действует как пул потоков. Чтобы прервать все потоки в пуле, вы можете вызвать executorService.shutdown();, и все запущенные потоки будут прерваны.

1 голос
/ 29 декабря 2011

Просто храните где-нибудь ссылки на созданные темы. Основной класс может поддерживать список для N потоков, а каждый N поток может поддерживать ссылку на потоки a, b и c, которые он создает.

0 голосов
/ 29 декабря 2011

Вы можете сохранить ссылки (более чистое решение).

Или, если у вас есть общая группа потоков, вы можете взломать ее следующим образом:

// 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);
    }
}

И если вы можете определить потоки(По имени потока, например) вы можете убить их.Я настоятельно рекомендую первое решение - просто хранить ссылки в древовидной структуре с глобальными ссылками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...