网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.J2EE WEB层的曙光 -- JSF.
.Java SE 6 新特性: HTTP 增强.
.throw 语句.
.用Java 接口实现回调函数的等价功.
.关于J2EE中死锁问题的研究.
.基于Java的Web服务器工作原理(3).
.激情后的思考:.NET想说爱你不容.
.Java开发中的线程安全选择与Swin.
.Java设计模式之修饰模式篇.
.Java的网络功能与编程.
.用java中的canendal 如何计算两个.
.Shark中的ToolAgent用法-Runtime.
.用 JAAS 和 JSSE 实现Java 安全性.
.用JavaBean实现文件上载(6).
.四种Java脚本语言之评测.
.使用Java Swing 创建一个XML编辑.
.Java理论和实践:用软引用阻止内存.
.转:《学不会的JAVA,消不了的忧.
.创建通过 WDO访问数据的 JSF 应用.
.获取本地计算机和其他计算机的MA.

Java中的线程组

发表日期:2008-1-5



  所有线程都隶属于一个线程组。那可以是一个默认线程组,亦可是一个创建线程时明确指定的组。在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组。每个应用都至少有一个线程从属于系统线程组。若创建多个线程而不指定一个组,它们就会自动归属于系统线程组。
  线程组也必须从属于其他线程组。必须在构建器里指定新线程组从属于哪个线程组。若在创建一个线程组的时候没有指定它的归属,则同样会自动成为系统线程组的一名属下。因此,一个应用程序中的所有线程组最终都会将系统线程组作为自己的“父”。
  之所以要提出“线程组”的概念,很难从字面上找到原因。这多少为我们讨论的主题带来了一些混乱。一般地说,我们认为是由于“安全”或者“保密”方面的理由才使用线程组的。根据Arnold和Gosling的说法:“线程组中的线程可以修改组内的其他线程,包括那些位于分层结构最深处的。一个线程不能修改位于自己所在组或者下属组之外的任何线程”(注释①)。然而,我们很难判定“修改”在这儿的具体含义是什么。下面这个例子展示了位于一个“叶子组”内的线程能修改它所在线程组树的所有线程的优先级,同时还能为这个“树”内的所有线程都调用一个方法。
  ①:《The Java Programming Language》第179页。该书由Arnold和Jams Gosling编著,Addison-Wesley于1996年出版
  //: 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 TestThread1(x, "one"),
   two = new TestThread2(z, "two");
   }
  }
  class TestThread1 extends Thread {
   private int i;
   TestThread1(ThreadGroup g, String name) {
   super(g, name);
   }
   void f() {
   i++; // modify this thread
   System.out.println(getName() + " f()");
   }
  }
  class TestThread2 extends TestThread1 {
   TestThread2(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 = 0; 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下方。注重初始化是按照文字顺序进行的,所以代码合法。
  有两个线程创建之后进入了不同的线程组。其中,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[two,5,z]
  one f()
  two 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[two,1,z]
  list()不仅打印出ThreadGroup或者Thread的类名,也打印出了线程组的名字以及它的最高优先级。
上一篇:Java多线程的优先级 人气:1081
下一篇:Java多线程编程 人气:900
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐