Java中的线程组

时间:2020-01-09 10:35:05  来源:igfitidea点击:

所有线程都属于Java中的线程组之一。在Java中创建线程时,如果未明确指定线程组,则将其放入我们指定的线程组中,或者放入与创建该线程的线程相同的组中。

默认线程组

启动Java应用程序时,一个线程立即开始运行,这在Java中称为主线程,并且该主线程属于一个名为main的线程组。如果创建其他线程(在主线程的上下文中)而未指定线程组,则这些线程也将属于主线程组。

Java中线程组的用法

线程组提供了一种方便的方式来将多个线程作为一个线程组对象进行管理。使用该线程组对象,我们可以将属于该组的所有线程作为一个单元进行操作,而不必单独进行操作。

例如Thread.currentThread()。getThreadGroup()。interrupt();

这将用一个语句中断所有属于该线程组的线程。

Java中的ThreadGroup类

Java提供了一个类java.lang.ThreadGroup用于在Java中创建线程组。

ThreadGroup类构造函数

ThreadGroup类具有两个用于创建线程组的构造函数。

  • public ThreadGroup(String name)–构造一个新的线程组。这个新组的父级是当前正在运行的线程的线程组。

  • public ThreadGroup(ThreadGroup parent,String name)–创建一个新的线程组。这个新组的父级是指定的线程组。

ThreadGroup类中的方法
ThreadGroup类的一些重要方法是。

  • 字符串getName()–返回此线程组的名称。

  • ThreadGroup getParent()–返回此线程组的父级。

  • boolean isDaemon()–测试此线程组是否是守护程序线程组。

  • void checkAccess()–确定当前正在运行的线程是否具有修改此线程组的权限。

  • int activeCount()–返回此线程组及其子组中活动线程的数量的估计值。递归地迭代此线程组中的所有子组。

  • int enumerate(Thread [] list)–将此线程组及其子组中的每个活动线程复制到指定的数组中。

  • void interrupt()–中断此线程组中的所有线程。

  • void list()–将有关此线程组的信息打印到标准输出。

在特定线程组中创建线程

Java中的线程类提供了可在其中指定线程组的构造函数。这些构造函数中很少列出。

  • 公共线程(线程组组,可运行目标)

  • 公共线程(ThreadGroup组,字符串名称)

  • 公共线程(线程组组,可运行目标,字符串名称)

线程组Java示例

public class TGDemo implements Runnable {
  public static void main(String[] args) {
    System.out.println("In main method " + Thread.currentThread().getName() 
        + " Group " + Thread.currentThread().getThreadGroup().getName());
    TGDemo runnableTarget = new TGDemo();
    // Creating two thread groups
    ThreadGroup group1 = new ThreadGroup("Group-1");
    ThreadGroup group2 = new ThreadGroup("Group-2");
    // Creating 4 threads belonging to the created thread groups
    Thread t1 = new Thread(group1, runnableTarget, "T1");
    Thread t2 = new Thread(group1, runnableTarget, "T2");
    Thread t3 = new Thread(group2, runnableTarget, "T3");
    Thread t4 = new Thread(group2, runnableTarget, "T4");
    t1.start();
    t2.start();
    t3.start();
    t4.start();
    group1.list();
    group2.list();
  }

  @Override
  public void run() {
    System.out.println("In run method " + Thread.currentThread().getName() 
        + " Group " + Thread.currentThread().getThreadGroup().getName());
    if(Thread.currentThread().getThreadGroup().getName().equals("Group-1")){
      Thread.currentThread().getThreadGroup().interrupt();
    }
    if (Thread.interrupted()) {
      System.out.println("interrupted " + Thread.currentThread().getName());
    }
  }
}

输出:

In main method main Group main
In run method T1 Group Group-1
java.lang.ThreadGroup[name=Group-1,maxpri=10]
In run method T2 Group Group-1
Thread[T1,5,Group-1]
In run method T4 Group Group-2
Thread[T2,5,Group-1]
java.lang.ThreadGroup[name=Group-2,maxpri=10]
Thread[T3,5,Group-2]
interrupted T1
interrupted T2
In run method T3 Group Group-2

如我们最初看到的那样,应用程序启动时,主线程开始运行,它属于线程组main。

然后创建两个线程组" Group-1"和" Group-2"。还创建了四个线程,这些线程属于" Group-1",另外两个属于" Group-2"。

在run()方法中,我们可以看到属于" Group-1"的线程有特定的逻辑。