用java线程获取优异性能(i)
jeff friesen 著 刘建华 编译 【程序编程相关:COM实现聚合所使用的C++技巧】——介绍线程.线程类及runnable 【推荐阅读:SQL查询语句优化的一点】 查询活跃线程 在有些情形下,你可能想了解在你的程序中哪些线程是激活的.thread支持一对方法帮助你完成这个任务: activecount()与 enumerate(thread [] thdarray).但那些方法只工作在当前线程的线程组中.换句话说,那些方法只识别属于当前线程的同一线程组的活跃线程. (我将在以后的系列文章中讨论线程组——一种组织机制.) 静态activecount()方法返回在当前线程的线程组中正在活跃运行的线程数量.一个程序利用这个方法的整数返回值设定一个thread引用数组的大小.检索那些引用,程序必须调用静态enumerate(thread [] thdarray)方法.这个方法的整数返回值确定thread引用存贮在数组中的enumerate(thread []thdarray)的总数.要看这些方法如何一起工作,请查看表6: 表6. census.java // census.java class census { public static void main (string [] args) { thread [] threads = new thread [thread.activecount ()]; int n = thread.enumerate (threads); for (int i = 0; i < n; i++) system.out.println (threads [i].tostring ()); } } 在运行时,这个程序会产生如下的输出: thread[main,5,main] 输出显示一个线程,开始线程正在运行.左边的main表示线程的名称.5显示线程的优先权,右边的main表示线程的线程组.你也许很失望不能在输出中看到任何系统线程,比如垃圾收集器线程.那种限制由thread的enumerate(thread [] thdarray) 方法产生,它仅询问当前线程线程组的活跃线程.然而, threadgroup类包含多种enumerate()方法允许你捕获对所有活跃线程的引用而不管线程组.在稍后的系列中,探讨threadgroup时我将向你显示如何列举所有的引用. 警告 当重申一个数组时不要依靠activecount()的返回值.如果你这样做了,你的程序将冒掷出一个nullpointerexception对象的风险.为什么呢?在调用activecount()与enumerate(thread [] thdarray)之间,一个或更多线程可能结束.结果, enumerate(thread [] thdarray)能够复制少数线程引用进它的数组.因此,仅考虑将activecount()的返回值作为数组可能大小的最大值.... 下一页