Java线程组

Java线程组

Java提供了一种在单个对象中组合多个线程的便捷方法。通过这种方式,通过单个方法调用暂停,恢复或中断线程组。

注意: 现在不推荐使用suspend()resume()stop()方法。

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

ThreadGroup表示一组线程。 线程组还可以包括其他线程组。 线程组创建一个树,其中除初始线程组之外的每个线程组都具有父线程。

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

ThreadGroup类的构造函数

ThreadGroup类只有两个构造函数。

编号 构造函数 描述
1 ThreadGroup(String name) 创建具有给定名称的线程组。
2 ThreadGroup(ThreadGroup parent, String name) 创建具有给定父组和名称的线程组。

ThreadGroup类的方法

ThreadGroup类中有许多方法,下面给出了ThreadGroup方法的列表。

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

下面来一个分组多个线程的代码。

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接口的类,“one”,“two”和“three”是线程名称。

现在只能通过一行代码中断所有线程。

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

ThreadGroup示例

示例: ThreadGroupDemo.java

package com.zyiz;

public class ThreadGroupDemo implements Runnable {
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        ThreadGroupDemo runnable = new ThreadGroupDemo();
        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
three
two
one
java.lang.ThreadGroup[name=Parent ThreadGroup,maxpri=10]
    Thread[one,5,Parent ThreadGroup]
    Thread[two,5,Parent ThreadGroup]
    Thread[three,5,Parent ThreadGroup]