线程类Thread的API接口分析系列之线程组ThreadGroup

    xiaoxiao2021-03-25  108

    先看看整个java的线程组体系

    public static void main(String[] args) {

                       //TODO Auto-generated method stub

                       ThreadGrouptg = new ThreadGroup("新建线程组");

                       System.out.println(Thread.currentThread().getThreadGroup().getName());//main

                       System.out.println(tg.getParent().getName());//main

             System.out.println(Thread.currentThread().getThreadGroup().getParent().getName());//system

    System.out.println(Thread.currentThread().getThreadGroup().getParent().getParent().getName());//java.lang.NullPointerException

             }

    --main方法所属的主线程所在的线程组:main,其他在main方法中创建的线程和线程组所属的线程组都是main线程组(包括主线程main),而tg 这个线程组虽然没有明显地加入 main线程组,但是会默认加入当前线程所在的线程组也就是main线程组,main线程组上一级的线程组为system线程组,这也是最顶级的线程组,再上面就没有了,这就是线程组的体系结构

     

    线程和线程组关联的用法:

    public class TreadGroupTest implementsRunnable {

     

             /*@author : zhengrf1

              * @date 创建时间:2017年3月9日 下午5:35:09

              * @see java.lang.Runnable#run()

              */

             @Override

             publicvoid run() {

                       //TODO Auto-generated method stub

                       System.out.println(Thread.currentThread().getName()+"isbelong to"+Thread.currentThread().getThreadGroup().getName());

             }

     

             /**

             *

             *@author : zhengrf1

             *@date 创建时间:2017年3月9日下午5:35:09

             */

             publicstatic void main(String[] args) {

                       //TODO Auto-generated method stub

                       ThreadGrouptg = new ThreadGroup("新建线程组");

                       Threadt1 = new Thread(tg,new TreadGroupTest());

                       Threadt2 = new Thread(tg,new TreadGroupTest());

                       t1.start();

                       t2.start();

             }

     

    }

     

    输出:

    Thread-0is belong to新建线程组

    Thread-1is belong to新建线程组

     

    批量管理线程组下面的线程:

    public class TreadGroupTest implementsRunnable {

     

             /*@author : zhengrf1

              * @date 创建时间:2017年3月9日 下午5:35:09

              * @see java.lang.Runnable#run()

              */

             @Override

             publicvoid run() {

                       //TODO Auto-generated method stub

                       while(true){

                       System.out.println(Thread.currentThread().getName()+"isbelong to"+Thread.currentThread().getThreadGroup().getName());

                       try{

                                Thread.sleep(1000);

                       }catch (InterruptedException e) {

                                //TODO Auto-generated catch block

                                e.printStackTrace();

                       }

                       }

                               

             }

     

             /**

             *

             *@author : zhengrf1

             *@date 创建时间:2017年3月9日下午5:35:09

             */

             publicstatic void main(String[] args) {

                       //TODO Auto-generated method stub

                       ThreadGrouptg = new ThreadGroup("新建线程组");

                       Threadt1 = new Thread(tg,new TreadGroupTest());

                       Threadt2 = new Thread(tg,new TreadGroupTest());

                       t1.start();

                       t2.start();

                       tg.setDaemon(true);

                       tg.interrupt();

             }

     

    }

    --批量对tg下面的线程发送中止信号,看看源码:

       public final void interrupt() {

           int ngroupsSnapshot;

           ThreadGroup[] groupsSnapshot;

           synchronized (this) {

               checkAccess();

               for (int i = 0 ; i < nthreads ; i++) {

                    threads[i].interrupt();

               }

               ngroupsSnapshot = ngroups;

               if (groups != null) {

                    groupsSnapshot =Arrays.copyOf(groups, ngroupsSnapshot);

               } else {

                    groupsSnapshot = null;

               }

           }

           for (int i = 0 ; i < ngroupsSnapshot ; i++) {

               groupsSnapshot[i].interrupt();

           }

    }

    --循环遍历组下的所有线程组,每个线程都调用threads[i].interrupt();,其他接口比如suspend(),resume(),这些都类似,循环每个线程调用同名接口。不过有个接口比较特殊,setDaemon(true)并没有循环组内线程进行守护线程设置。

    转载请注明原文地址: https://ju.6miu.com/read-14774.html

    最新回复(0)