Введение в ThreadGroup параллелизма Java

Java

Введение в группы потоков

группа тем (ThreadGroup) представляет собой просто набор потоков. Появление групп потоков — это более удобное управление потоками.

Группа потоков представляет собой родительско-дочернюю структуру, группа потоков может интегрировать другие группы потоков, а также может иметь другие группы дочерних потоков. Структурно группа потоков представляет собой древовидную структуру, каждый поток принадлежит к группе потоков, а группа потоков имеет родительскую группу потоков.Таким образом, ее можно проследить до корневой группы потоков — группы системных потоков.

Ниже описывается структура дерева групп потоков:

  1. Группа системных потоков, созданная JVM, — это группа потоков, используемая для обработки системных задач JVM, таких как уничтожение объектов.
  2. Непосредственная группа дочерних потоков группы системных потоков — это основная группа потоков, которая содержит по крайней мере один основной поток для выполнения основного метода.
  3. Группа дочерних потоков основной группы потоков — это группа потоков, созданная приложением.

Вы можете увидеть группу системных потоков и группу основных потоков, созданную 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

Ресурсы для авторов

связанные ресурсы