Введение в группы потоков
группа тем (ThreadGroup
) представляет собой просто набор потоков. Появление групп потоков — это более удобное управление потоками.
Группа потоков представляет собой родительско-дочернюю структуру, группа потоков может интегрировать другие группы потоков, а также может иметь другие группы дочерних потоков. Структурно группа потоков представляет собой древовидную структуру, каждый поток принадлежит к группе потоков, а группа потоков имеет родительскую группу потоков.Таким образом, ее можно проследить до корневой группы потоков — группы системных потоков.
Ниже описывается структура дерева групп потоков:
- Группа системных потоков, созданная JVM, — это группа потоков, используемая для обработки системных задач JVM, таких как уничтожение объектов.
- Непосредственная группа дочерних потоков группы системных потоков — это основная группа потоков, которая содержит по крайней мере один основной поток для выполнения основного метода.
- Группа дочерних потоков основной группы потоков — это группа потоков, созданная приложением.
Вы можете увидеть группу системных потоков и группу основных потоков, созданную JVM в основном методе:
public static void main(String[] args) {
ThreadGroup mainThreadGroup=Thread.currentThread().getThreadGroup();
ThreadGroup systenThreadGroup=mainThreadGroup.getParent();
System.out.println("systenThreadGroup name = "+systenThreadGroup.getName());
System.out.println("mainThreadGroup name = "+mainThreadGroup.getName());
}
вывод консоли:
systenThreadGroup name = system
mainThreadGroup name = main
Поток может получить доступ к информации группы потоков, к которой он принадлежит, но не может получить доступ к информации родительской группы потоков группы потоков, к которой он принадлежит, или других групп потоков.
Построение группы потоков
java.lang.ThreadGroup
Предусмотрено два конструктора:
Constructor | Description |
---|---|
ThreadGroup(String name) | Создайте группу потоков на основе имени группы потоков, чья родительская группа потоков является основной группой потоков. |
ThreadGroup(ThreadGroup parent, String name) | Создайте группу потоков на основе имени группы потоков, чья родительская группа потоков является указанной группой родительских потоков. |
Ниже показано использование этих двух конструкторов:
public static void main(String[] args) {
ThreadGroup subThreadGroup1 = new ThreadGroup("subThreadGroup1");
ThreadGroup subThreadGroup2 = new ThreadGroup(subThreadGroup1, "subThreadGroup2");
System.out.println("subThreadGroup1 parent name = " + subThreadGroup1.getParent().getName());
System.out.println("subThreadGroup2 parent name = " + subThreadGroup2.getParent().getName());
}
вывод консоли:
subThreadGroup1 parent name = main
subThreadGroup2 parent name = subThreadGroup1
Введение в метод ThreadGroup
ThreadGroup предоставляет множество полезных методов, краткое введение в эти методы и некоторые примеры использования некоторых методов приведены ниже.
S.N. | Method | Description |
---|---|---|
1) | void checkAccess() | This method determines if the currently running thread has permission to modify the thread group. |
2) | int activeCount() | This method returns an estimate of the number of active threads in the thread group and its subgroups. |
3) | int activeGroupCount() | This method returns an estimate of the number of active groups in the thread group and its subgroups. |
4) | void destroy() | This method destroys the thread group and all of its subgroups. |
5) | int enumerate(Thread[] list) | This method copies into the specified array every active thread in the thread group and its subgroups. |
6) | int getMaxPriority() | This method returns the maximum priority of the thread group. |
7) | String getName() | This method returns the name of the thread group. |
8) | ThreadGroup getParent() | This method returns the parent of the thread group. |
9) | void interrupt() | This method interrupts all threads in the thread group. |
10) | boolean isDaemon() | This method tests if the thread group is a daemon thread group. |
11) | void setDaemon(boolean daemon) | This method changes the daemon status of the thread group. |
12) | boolean isDestroyed() | This method tests if this thread group has been destroyed. |
13) | void list() | This method prints information about the thread group to the standard output. |
14) | boolean parentOf(ThreadGroup g) | This method tests if the thread group is either the thread group argument or one of its ancestor thread groups. |
15) | void suspend() | This method is used to suspend all threads in the thread group. |
16) | void resume() | This method is used to resume all threads in the thread group which was suspended using suspend() method. |
17) | void setMaxPriority(int pri) | This method sets the maximum priority of the group. |
18) | void stop() | This method is used to stop all threads in the thread group. |
19) | String toString() | This method returns a string representation of the Thread group. |
Просмотр информации о группе потоков
Ниже показано, как просмотреть информацию о текущей группе потоков.
public static void list(){
ThreadGroup tg = new ThreadGroup ("subgroup 1");
Thread t1 = new Thread (tg, "thread 1");
Thread t2 = new Thread (tg, "thread 2");
Thread t3 = new Thread (tg, "thread 3");
tg = new ThreadGroup ("subgroup 2");
Thread t4 = new Thread (tg, "my thread");
tg = Thread.currentThread ().getThreadGroup ();
int agc = tg.activeGroupCount ();
System.out.println ("Active thread groups in " + tg.getName () + " thread group: " + agc);
tg.list ();
}
Результат выглядит следующим образом:
Active thread groups in main thread group: 2
java.lang.ThreadGroup[name=main,maxpri=10]
Thread[main,5,main]
java.lang.ThreadGroup[name=subgroup 1,maxpri=10]
java.lang.ThreadGroup[name=subgroup 2,maxpri=10]
Завершить все потоки в группе потоков
Поток не должен быть принудительно прерван или остановлен другими потоками, но должен быть остановлен самим потоком.
следовательноThread.currentThread().stop()
, Thread.currentThread().suspend()
, Thread.currentThread().resume()
были заброшены.
interrupt()
Функция метода состоит в том, чтобы уведомить поток о том, что его следует прервать, а вопрос о том, прервать или продолжить выполнение, обрабатывается уведомленным потоком.
public class ThreadGroupExampleInterrupt {
public static void main(String[] args) {
// Start two threads
MyThread mt = new MyThread();
mt.setName("A");
mt.start();
mt = new MyThread();
mt.setName("B");
mt.start();
// Wait 2 seconds
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Interrupt all methods in the same thread group as the main thread
Thread.currentThread().getThreadGroup().interrupt();
}
//一个启动以后进入等待,直到被interrupt的线程
static class MyThread extends Thread {
public void run() {
synchronized ("A") {
System.out.println(getName() + " about to wait.");
try {
"A".wait();
} catch (InterruptedException e) {
System.out.println(getName() + " interrupted.");
}
System.out.println(getName() + " terminating.");
}
}
}
}
воплощать в жизньmain
Вывод метода:
A about to wait.
B about to wait.
A interrupted.
A terminating.
B interrupted.
B terminating.
Суммировать
В этом разделе описываются группы потоков (ThreadGroup
), его структуру и конструктор, а также демонстрирует несколько способов использования групп потоков для простого управления потоками внутри группы.
Этот раздел является частью серии руководств по параллелизму. Дополнительные руководства можно найти по ссылкам в конце статьи.
В будущем будет больше представлений о точках знаний параллельного программирования, которые будут представлены в сочетании с корпоративными проектами. Добро пожаловать, чтобы продолжать обращать внимание.
Links
Ресурсы для авторов
-
Java Concurrency Thread Pool Series (1) Пул потоков, который делает многопоточность более простой
-
Введение и основы использования Future of Java Concurrent Future Series
-
Подождите и уведомите о серии сообщений Java Concurrent Thread