zoukankan      html  css  js  c++  java
  • [Java 并发]带你从源码解读线程组( ThreadGroup )好不好

    ThreadGroup 概念

    只是从英文名字上,也能看到这个概念的简单粗暴, ThreadGroup 就是线程组.
    也就是说,每个 Thread 都能在一个 ThreadGroup 中找到.那么你可能会问了,我不存在于一个 ThreadGroup 不行?自己在程序里面一个人潇洒走天下,岂不是超级爽?
    抱歉,此路不通.为啥呢?咱们来看源码:

    private void init(ThreadGroup g, Runnable target, String name,
                          long stackSize, AccessControlContext acc,
                          boolean inheritThreadLocals) {
            Thread parent = currentThread();
            SecurityManager security = System.getSecurityManager();
            if (g == null) {
                /* Determine if it's an applet or not */
    
                /* If there is a security manager, ask the security manager
                   what to do. */
                if (security != null) {
                    g = security.getThreadGroup();
                }
    
                /* If the security doesn't have a strong opinion of the matter
                   use the parent thread group. */
                if (g == null) {
                    g = parent.getThreadGroup();
                }
            }
        }
    

    我们能够看到,如果 g 为空,会做这样的处理

    • 首先看 security 是否为空,如果不为空,直接使用 security 的线程组
    • 如果 security 是空的话,那么这个线程就获取当前线程所属的线程组
      所以你想脱离组织自己玩?这种事情想都不要想.
      操作系统怎么可能允许有逃离自己掌控之外的存在呢!

    优先级

    OK ,咱们接下来谈另外一个问题.
    一个 Thread 必然存在于一个 ThreadGroup , Thread 有自己的优先级, ThreadGroup 也有优先级,如果 Thread 的优先级大于 ThreadGroup 的优先级了,这个时候咋整呢?

    public final void setPriority(int newPriority) {
            ThreadGroup g;
            checkAccess();
            // 如果设置的 priority 大于系统设置的最大值,或者小于系统设置的最小值
            // 抛出异常
            if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
                throw new IllegalArgumentException();
            }
            if((g = getThreadGroup()) != null) {
                // 如果设置线程的优先级大于线程组的优先级,则重置线程的优先级为线程组的优先级
                if (newPriority > g.getMaxPriority()) {
                    newPriority = g.getMaxPriority();
                }
                setPriority0(priority = newPriority);
            }
        }
    

    所以啊,优先级冲突了,两位也别吵吵, Thread 踏踏实实跟着 ThreadGroup 走才有肉吃不是~

    ThreadGroup 还可以做

    看完上面,你可能觉得,哦,原来线程组就是管线程的啊
    你如果真的这么认为的话,我赶紧写写接下来的内容,把你的思绪拉一拉
    线程组管理的可不单单是线程.
    咱们看看源码里面,线程组的成员变量都有啥:

    public class ThreadGroup implements Thread.UncaughtExceptionHandler {
        private final ThreadGroup parent;  // 父 ThreadGroup
        String name;  // ThreadGroup 名称
        int maxPriority;  // 线程最大优先级
        boolean destroyed;  // 是否被销毁
        boolean daemon;  // 是否守护线程
        boolean vmAllowSuspension;  // 是否可以中断
    
        int nUnstartedThreads = 0;  // 还未启动的线程
        int nthreads;  // ThreadGroup 中线程数目
        Thread threads[];  // ThreadGroup 中的线程
    
        int ngroups;  // 线程组数目
        ThreadGroup groups[];  // 线程组数组
    }
    

    吼,原来线程组里面还可以有线程组,不单单是有线程,原来还可以控制线程优先级,还可以决定是否销毁线程或者守护线程,或者中断线程.

    到这里,咱们来总结一下:

    • 线程组是一个父子结构,一个线程组可以属于其他线程组,也可以拥有自己的子线程组,如果你一直向上追溯的话,会发现所有的线程组都在一个根线程组里面— System 线程组
    • 线程组的出现可不是为耍酷用的,它是为了更方便的管理线程而存在的.比如设置线程最大优先级,销毁线程等等

    以上,就是想要分享的内容了
    感谢您的阅读哇~

  • 相关阅读:
    CentOS7安装minio
    xshell连接虚拟机Connection failed
    Mysql时间加减函数
    mysql存储过程模板
    Activiti实现会签功能
    2018考研复试流程
    C编程经验总结5(剧终)
    《数据结构总结》
    《关于安卓和IOS开发》
    番外特别篇之 为什么我不建议你直接使用UIImage传值?--从一个诡异的相册九图连读崩溃bug谈起
  • 原文地址:https://www.cnblogs.com/zll-0405/p/12900531.html
Copyright © 2011-2022 走看看