知识大全 Java中的线程组

Posted

篇首语:所谓的成熟、其实就是在不断看开狠多事情之后、更好的生活着。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java中的线程组相关的知识,希望对你有一定的参考价值。

Java中的线程组  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  所有线程都隶属于一个线程组 那可以是一个默认线程组 亦可是一个创建线程时明确指定的组 在创建之初 线程被限制到一个组里 而且不能改变到一个不同的组 每个应用都至少有一个线程从属于系统线程组 若创建多个线程而不指定一个组 它们就会自动归属于系统线程组   线程组也必须从属于其他线程组 必须在构建器里指定新线程组从属于哪个线程组 若在创建一个线程组的时候没有指定它的归属 则同样会自动成为系统线程组的一名属下 因此 一个应用程序中的所有线程组最终都会将系统线程组作为自己的 父   之所以要提出 线程组 的概念 很难从字面上找到原因 这多少为我们讨论的主题带来了一些混乱 一般地说 我们认为是由于 安全 或者 保密 方面的理由才使用线程组的 根据Arnold和Gosling的说法 线程组中的线程可以修改组内的其他线程 包括那些位于分层结构最深处的 一个线程不能修改位于自己所在组或者下属组之外的任何线程 (注释①) 然而 我们很难判断 修改 在这儿的具体含义是什么 下面这个例子展示了位于一个 叶子组 内的线程能修改它所在线程组树的所有线程的优先级 同时还能为这个 树 内的所有线程都调用一个方法   ① 《The Java Programming Language》第 页 该书由Arnold和Jams Gosling编著 Addison Wesley于 年出版  //: TestAccess java  // How threads can access other threads  // in a parent thread group  public class TestAccess    public static void main(String[] args)    ThreadGroup    x = new ThreadGroup( x )    y = new ThreadGroup(x y )    z = new ThreadGroup(y z );   Thread   one = new TestThread (x one )    o = new TestThread (z o );       class TestThread extends Thread    private int i;   TestThread (ThreadGroup g String name)    super(g name);      void f()    i++; // modify this thread   System out println(getName() + f() );       class TestThread extends TestThread    TestThread (ThreadGroup g String name)    super(g name);   start();      public void run()    ThreadGroup g =   getThreadGroup() getParent() getParent();   g list();   Thread[] gAll = new Thread[g activeCount()];   g enumerate(gAll);   for(int i = ; i < gAll.length; i++)    gAll[i].setPriority(Thread.MIN_PRIORITY);   ((TestThread1)gAll[i]).f();      g.list();      ///:~  在main()中,我们创建了几个ThreadGroup(线程组),每个都位于不同的“叶”上:x没有参数,只有它的名字(一个String),所以会自动进入“system”(系统)线程组;y位于x下方,而z位于y下方。WIngwiT.Com注意初始化是按照文字顺序进行的,所以代码合法。  有两个线程创建之后进入了不同的线程组。其中,TestThread1没有一个run()方法,但有一个f(),用于通知线程以及打印出一些东西,以便我们知道它已被调用。而TestThread2属于TestThread1的一个子类,它的run()非常详尽,要做许多事情。首先,它获得当前线程所在的线程组,然后利用getParent()在继承树中向上移动两级(这样做是有道理的,因为我想把TestThread2在分级结构中向下移动两级)。随后,我们调用方法activeCount(),查询这个线程组以及所有子线程组内有多少个线程,从而创建由指向Thread的句柄构成的一个数组。enumerate()方法将指向所有这些线程的句柄置入数组gAll里。然后在整个数组里遍历,为每个线程都调用f()方法,同时修改优先级。这样一来,位于一个“叶子”线程组里的线程就修改了位于父线程组的线程。  调试方法list()打印出与一个线程组有关的所有信息,把它们作为标准输出。在我们对线程组的行为进行调查的时候,这样做是相当有好处的。下面是程序的输出:  java.lang.ThreadGroup[name=x,maxpri=10]   Thread[one,5,x]   java.lang.ThreadGroup[name=y,maxpri=10]   java.lang.ThreadGroup[name=z,maxpri=10]   Thread[o,5,z]  one f()  o f()  java.lang.ThreadGroup[name=x,maxpri=10]   Thread[one,1,x]   java.lang.ThreadGroup[name=y,maxpri=10]   java.lang.ThreadGroup[name=z,maxpri=10]   Thread[o,1,z]  list()不仅打印出ThreadGroup或者Thread的类名,也打印出了线程组的名字以及它的最高优先级。对于线程,则打印出它们的名字,并接上线程优先级以及所属的线程组。注意list()会对线程和线程组进行缩排处理,指出它们是未缩排的线程组的“子”。  大家可看到f()是由TestThread2的run()方法调用的,所以很明显,组内的所有线程都是相当脆弱的。然而,我们只能访问那些从自己的system线程组树分支出来的线程,而且或许这就是所谓“安全”的意思。我们不能访问其他任何人的系统线程树。   线程组的控制  抛开安全问题不谈,线程组最有用的一个地方就是控制:只需用单个命令即可完成对整个线程组的操作。下面这个例子演示了这一点,并对线程组内优先级的限制进行了说明。括号内的注释数字便于大家比较输出结果:  //: ThreadGroup1.java  // How thread groups control priorities  // of the threads inside them.  public class ThreadGroup1    public static void main(String[] args)    // Get the system thread & print its Info:   ThreadGroup sys =    Thread.currentThread().getThreadGroup();   sys.list(); // (1)   // Reduce the system thread group priority:   sys.setMaxPriority(Thread.MAX_PRIORITY - 1);   // Increase the main thread priority:   Thread curr = Thread.currentThread();   curr.setPriority(curr.getPriority() + 1);   sys.list(); // (2)   // Attempt to set a new group to the max:   ThreadGroup g1 = new ThreadGroup("g1");   g1.setMaxPriority(Thread.MAX_PRIORITY);   // Attempt to set a new thread to the max:   Thread t = new Thread(g1, "A");   t.setPriority(Thread.MAX_PRIORITY);   g1.list(); // (3)   // Reduce g1\'s max priority, then attempt   // to increase it:   g1.setMaxPriority(Thread.MAX_PRIORITY - 2);   g1.setMaxPriority(Thread.MAX_PRIORITY);   g1.list(); // (4)   // Attempt to set a new thread to the max:   t = new Thread(g1, "B");   t.setPriority(Thread.MAX_PRIORITY);   g1.list(); // (5)   // Lower the max priority below the default   // thread priority:   g1.setMaxPriority(Thread.MIN_PRIORITY + 2);   // Look at a new thread\'s priority before   // and after changing it:   t = new Thread(g1, "C");   g1.list(); // (6)   t.setPriority(t.getPriority() -1);   g1.list(); // (7)   // Make g2 a child Threadgroup of g1 and   // try to increase its priority:   ThreadGroup g2 = new ThreadGroup(g1, "g2");   g2.list(); // (8)   g2.setMaxPriority(Thread.MAX_PRIORITY);   g2.list(); // (9)   // Add a bunch of new threads to g2:   for (int i = 0; i < 5; i++)   new Thread(g2, Integer.toString(i));   // Show information about all threadgroups   // and threads:   sys.list(); // (10)   System.out.println("Starting all threads:");   Thread[] all = new Thread[sys.activeCount()];   sys.enumerate(all);   for(int i = 0; i < all.length; i++)   if(!all[i].isAlive())   all[i].start();   // Suspends & Stops all threads in    // this group and its subgroups:   System.out.println("All threads started");   sys.suspend(); // Deprecated in Java 1.2   // Never gets here...   System.out.println("All threads suspended");   sys.stop(); // Deprecated in Java 1.2   System.out.println("All threads stopped");      ///:~  下面的输出结果已进行了适当的编辑,以便用一页能够装下(java.lang.已被删去),而且添加了适当的数字,与前面程序列表中括号里的数字对应:  (1) ThreadGroup[name=system,maxpri=10]   Thread[main,5,system]  (2) ThreadGroup[name=system,maxpri=9]   Thread[main,6,system]  (3) ThreadGroup[name=g1,maxpri=9]   Thread[A,9,g1]  (4) ThreadGroup[name=g1,maxpri= cha138/Article/program/Java/gj/201311/27518

相关参考

知识大全 Java系统线程组如何才能安全组建

Java系统线程组如何才能安全组建  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我们在使用Ja

知识大全 Java多线程例子

Java多线程例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  写出一组模拟生产者/消费者的协

知识大全 java多线程中的异常处理

  在java多线程程序中所有线程都不允许抛出未捕获的checkedexception也就是说各个线程需要自己把自己的checkedexception处理掉这一点是通过javalangRunnable

知识大全 JAVA多线程中的锁机制

JAVA多线程中的锁机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JAVA中的每个对象都可

知识大全 Java线程通信源代码中的奥秘探究

Java线程通信源代码中的奥秘探究  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java线程通

知识大全 Java线程池在使用中的问题解疑

Java线程池在使用中的问题解疑  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java线程池需

知识大全 Java程序中的多线程

Java程序中的多线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一为什么会排队等待?  下

知识大全 实战Java多线程编程精要之高级支持

实战Java多线程编程精要之高级支持  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  线程组  线

知识大全 Java 6中的线程优化真的有效么

Java6中的线程优化真的有效么?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  介绍—Java

知识大全 Java 程序中的多线程(四)

Java程序中的多线程(四)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者NeelVKum