当前位置: 首页 > 教程 > Java多线程 >

Java 线程组

精华
小牛编辑
126浏览
2023-03-14

1 什么是Java ThreadGroup(线程组)

Java提供了一种将多个线程组合到单个对象中的便捷方法。这样,我们可以通过单个方法调用来挂起,恢复或中断线程组。

Java线程组由java.lang.ThreadGroup类实现。

ThreadGroup代表一组线程。一个线程组也可以包括另一个线程组。线程组创建一棵树,其中除初始线程组外的每个线程组都有一个父级。

允许线程访问有关其自己的线程组的信息,但不能访问有关其线程组的父线程组或任何其他线程组的信息。

2 Java ThreadGroup类的构造方法

ThreadGroup类只有两个构造方法。

构造方法 描述
ThreadGroup(String name) 创建具有给定名称的线程组。
ThreadGroup(ThreadGroup parent, String name) 创建具有给定父组和名称的线程组。

3 Java ThreadGroup类的方法

修饰符 方法 描述
void checkAccess() 确定当前正在运行的线程是否具有修改线程组的权限。
int activeCount() 返回线程组及其子组中活动线程数的估计值。
int activeGroupCount() 返回线程组及其子组中活动组的数量的估计值。
void destroy() 破坏线程组及其所有子组。
int enumerate(Thread[] list) 将线程组及其子组中的每个活动线程复制到指定的数组中。
int getMaxPriority() 返回线程组的最大优先级。
String getName() 返回线程组的名称。
ThreadGroup getParent() 返回线程组的父级。
void interrupt() 中断线程组中的所有线程。
boolean isDaemon() 判断线程组是否是守护程序线程组。
void setDaemon(boolean daemon) 更改线程组的守护程序状态。
boolean isDestroyed() 判断此线程组是否已被销毁。
void list() 将有关线程组的信息打印到标准输出。
boolean parentOf(ThreadGroup g) 判断线程组是线程组参数还是其祖先线程组之一。
void suspend() 用于挂起线程组中的所有线程。
void resume() 用于恢复使用suspend() 方法挂起的线程组中的所有线程。
void setMaxPriority(int pri) 设置组的最大优先级。
void stop() 用于停止线程组中的所有线程。
String toString() 返回Thread组的字符串表示形式。

让我们看一下将多个线程组合在一起的代码。

ThreadGroup tg1 = new ThreadGroup("Group A");   
Thread t1 = new Thread(tg1,new MyRunnable(),"one");     
Thread t2 = new Thread(tg1,new MyRunnable(),"two");     
Thread t3 = new Thread(tg1,new MyRunnable(),"three");    

现在,所有3个线程都属于一个组。tg1是线程组名称,MyRunnable是实现Runnable接口的类,“1”,“2”和“3”是线程名称。

现在,我们只需要用一行代码中断所有线程。

Thread.currentThread().getThreadGroup().interrupt();  

4 Java ThreadGroup类的例子

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 *  Java ThreadGroup类的例子
 */
public class Demo implements Runnable{
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
    public static void main(String[] args) {
        Demo runnable = new Demo();
        ThreadGroup tg1 = new ThreadGroup("Parent ThreadGroup");

        Thread t1 = new Thread(tg1, runnable,"one");
        t1.start();
        Thread t2 = new Thread(tg1, runnable,"two");
        t2.start();
        Thread t3 = new Thread(tg1, runnable,"three");
        t3.start();

        System.out.println("Thread Group Name: "+tg1.getName());
        tg1.list();

    }
}

输出结果为:

Thread Group Name: Parent ThreadGroup
java.lang.ThreadGroup[name=Parent ThreadGroup,maxpri=10]
    Thread[one,5,Parent ThreadGroup]
    Thread[two,5,Parent ThreadGroup]
    Thread[three,5,Parent ThreadGroup]
one
two
three