📜  Java多线程-threadgroup()线程组(1)

📅  最后修改于: 2023-12-03 15:32:02.895000             🧑  作者: Mango

Java多线程-threadgroup()线程组

Java多线程中,可以使用ThreadGroup来对线程进行分组管理。一个线程可以加入到某个线程组中,也可以创建一个新的线程组。线程组可以有子线程组,并且线程组中的线程可以通过线程组名字来访问。当一个线程组的某个线程出现异常时,同一组中的其他线程也会受到影响,都将停止执行。

创建线程组

创建一个线程组可以使用以下构造函数:

ThreadGroup(String name)    // 创建线程组并指定组名
ThreadGroup(ThreadGroup parent, String name)    // 创建线程组指定组名以及父线程组

使用单个参数构造函数创建的线程组没有父线程组。

线程加入线程组

使用以下方法可以将线程加入到指定的线程组中:

void ThreadGroup.add(Thread t)    // 将线程t加入到该线程组

当一个线程被创建时,默认是加入到其父线程组中,可以通过调用Thread的以下构造函数来将线程加入到指定的线程组中:

Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target, String name)
线程组中活动线程数

获取线程组中活动线程数的方法:

int ThreadGroup.activeCount()    // 返回该线程组中活动线程的数目
线程组中线程优先级设置

使用以下方法可以设置线程组中所有线程的优先级:

void ThreadGroup.setMaxPriority(int priority)    // 设置该线程组最高的优先级
终止线程组

以下方法可以终止线程组中的所有线程:

void ThreadGroup.interrupt()    // 终止该组中所有的线程
示例代码

下面是一个基本的线程组示例代码:

public class ThreadGroupExample implements Runnable {
    public void run() {
        System.out.println(Thread.currentThread().getName() + " is running");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " is finished");
    }
    
    public static void main(String[] args) {
        ThreadGroupExample runnable = new ThreadGroupExample();
        ThreadGroup group1 = new ThreadGroup("Group 1");
        
        Thread t1 = new Thread(group1, runnable, "Thread 1");
        Thread t2 = new Thread(group1, runnable, "Thread 2");
        Thread t3 = new Thread(group1, runnable, "Thread 3");
        
        t1.start();
        t2.start();
        t3.start();
        
        System.out.println("活动线程数: " + group1.activeCount());
        
        group1.list();    // 列出线程组中线程的信息
        
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("终止线程组 " + group1.getName());
        group1.interrupt();
    }
}

输出结果如下:

Thread 3 is running
Thread 1 is running
Thread 2 is running
活动线程数: 3
java.lang.ThreadGroup[name=Group 1,maxpri=10]
    Thread[Thread 1,5,Group 1]
    Thread[Thread 2,5,Group 1]
    Thread[Thread 3,5,Group 1]
Thread 3 is finished
Thread 1 is finished
Thread 2 is finished
终止线程组 Group 1