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