13线程组(ThreadGroup)


 

 

线程组(ThreadGroup

 导言

线程组在实际开发中很少用到,本节将简单的来介绍一下它。

第一点获取线程组

第二点创建建设组

第三点给线程设置限制组

第四点介绍线程组常用的方法。

 获取线程组

首先来看第一点,用thread类里面的getthreadgreap方法就可以获取到该线程所处的线程组,

如果该线程死亡,也就是线程执行完毕,则此方法返回null,否则返回该线程所处的线程组对象。

下面我们来演示该方法,以获取主线程所属的线程组为例,通过thread的类名调用currentthread的方法获取到当前线程,这里获取的就是主线程。然后调用线程的getthreadgroup方法获取所处的线程组,最后输出该线程组。

package com.chenjie.executor.day13;


import com.chenjie.executor.day12.Task;

/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className Main1 (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class Main {

    /**
     * 查询线程组信息
     * @param args
     */
    public static void main(String[] args) {
        Thread thread = Thread.currentThread();
        ThreadGroup threadGroup = thread.getThreadGroup();
        System.out.println(threadGroup);
    }
}

从运行结果来看,线程组信息由三个部分组成。

java.lang.ThreadGroup[name=main,maxpri=10]

下面我们来逐一解释,首先是线程组对象的类型,也就是threadgroup类,该类是用来描述线程组的

其次name等于main,表示该线程组的名称叫做main

最后maxpri等于10,表示线程组最大可以设置的优先级。

这里的PR I是priority(优先)的所写,至此第一点介绍完了

创建线程组

再来看第二点,第二点是创建线程组,直接调用threadgroup类的构造方法就可以创建线程组,

它有两个可以用的构造方法,这是第一个可以指定线程组的名称,

还有一个不光可以指定线程组的名称,还可以指定线程组的父线程组,待会我们将会以第一个构造方法来作为演示方法。

 设置线程组

第三点是设置线程组,是指线程组是通过thread类的构造方法来完成的

与之相关的有三个构造方法,这三个构造的方法都可以指定线程组。除此以外,第一个构造方法还可以指定线程名称,第二个构造方法还可以指定了runner波任务。第三个构造方法既可以指定线程名称,还可以指定runner部任务。

第一个

下面我们拿第一个构造的方法来做演示。首先创建一个线程组,然后指定线程组名称,创建一个线程,与此同时指定该线程所处的线程组,并指定它的名称,最后输出该线程。 

package com.chenjie.executor.day13;


/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className Main1 (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class Main1 {

    /**
     * 查询线程组信息
     * @param args
     */
    public static void main(String[] args) {
        ThreadGroup group = new ThreadGroup("人人都是程序员");
        Thread thread = new Thread(group,"线程");
        System.out.println(thread);
    }
}

从运行结果来看,线程名称和所属的线程组和我们自定义的一致至此。第三点介绍完了。

Thread[线程,5,人人都是程序员]

第二个

 

package com.chenjie.executor.day13;


/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className Main1 (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class Main2 {

    /**
     * 查询线程组信息
     * @param args
     */
    public static void main(String[] args) {
        Task task=new Task();
        ThreadGroup group = new ThreadGroup("人人都是程序员");
        Thread thread = new Thread(group,task);
        System.out.println(thread);
    }
}

 

第三种

package com.chenjie.executor.day13;


/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className Main1 (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class Main3 {

    /**
     * 查询线程组信息
     * @param args
     */
    public static void main(String[] args) {
        Task task=new Task();
        ThreadGroup group = new ThreadGroup("人人都是程序员");
        Thread thread = new Thread(group,task,"线程");
        System.out.println(thread);
    }
}

线程组中常用的方法有哪些?

再来看最后一点,线程组中常用的方法有哪些?线程组中常用的方法一共有5个,

第一个getname方法它用于获取线程组名称。第二个setmaxpriority方法,它用于设置线程组最大优先级。第三个 getmaxpriority方法。它用于获取线程组最大优先级。第四个activecount的方法,它用于获取线程组存活的线程的数量。第五个interrupt方法它用于中段线程组中所有线程。

main4

package com.chenjie.executor.day13;


/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className Main1 (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class Main4 {

    /**
     * 查询线程组信息
     * @param args
     */
    public static void main(String[] args) {
        ThreadGroup group = new ThreadGroup("人人都是程序员");
        System.out.println("线程组的名称"+group.getName());
        System.out.println("线程组的最大优先级"+group.getMaxPriority());
        //设置线程组的最大优先
        group.setMaxPriority(1);
        System.out.println("修改后线程组的最大优先级"+group.getMaxPriority());

        Thread thread=new Thread(group,"线程");
        thread.start();
        System.out.println("线程组存货的线程数量"+group.activeCount());
        //中断线程组中所有的线程
        group.interrupt();
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("线程组存货的线程数量"+group.activeCount());

    }
}

定义task

package com.chenjie.executor.day13;

/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className PringTask (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class Task implements Runnable{
    @Override
    public void run() {
        try {
            Thread.sleep(5000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

    }
}

结果

线程组的名称人人都是程序员
线程组的最大优先级10
修改后线程组的最大优先级1
线程组存货的线程数量1
线程组存货的线程数量0

总结

最后我们来总结一下本节内容,本节介绍了获取线程所处的线程组threadgroup方法以及创建线程组和设置线程组,线程组在实际开发中几乎不会用到它,所以大家只需知道此知识点即可。 

posted @ 2022-04-26 23:23  小陈子博客  阅读(950)  评论(0编辑  收藏  举报