Posted on 2009-06-02 20:49
啥都寫(xiě)點(diǎn) 閱讀(264)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
J2SE
關(guān)鍵技術(shù):
- 虛擬機(jī)中的任何線(xiàn)程都處于線(xiàn)程組ThreadGroup中,線(xiàn)程組也可以包含子線(xiàn)程組。
- Thread的currentThread靜態(tài)方法能夠獲得當(dāng)前線(xiàn)程的引用。
- Thread的getThreadGroup實(shí)例方法能夠獲得當(dāng)前線(xiàn)程所屬的線(xiàn)程組。
- ThreadGroup的getParent實(shí)例方法能夠獲得當(dāng)前線(xiàn)程組的父線(xiàn)程組,根線(xiàn)程組的父線(xiàn)程組為NULL。
package book.thread;
public class ListAllRunningThread {
/**
* 列出所有線(xiàn)程的信息
*/
public static void list(){
//獲取當(dāng)前線(xiàn)程所屬線(xiàn)程組的父線(xiàn)程組
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
//不斷循環(huán),直到找到根線(xiàn)程組
while (root.getParent() != null) {
root = root.getParent();
}
//訪(fǎng)問(wèn)根線(xiàn)程組下的線(xiàn)程
visit(root, 0);
}
/**
* 遞歸的顯示線(xiàn)程組中的線(xiàn)程
* @param group
* @param level
*/
private static void visit(ThreadGroup group, int level) {
// 獲取group線(xiàn)程組中活動(dòng)線(xiàn)程的估計(jì)數(shù)
int numThreads = group.activeCount();
Thread[] threads = new Thread[numThreads];
// 把此線(xiàn)程組中的所有活動(dòng)線(xiàn)程復(fù)制到指定數(shù)組中。
// false表示不包括作為此線(xiàn)程組的子組的線(xiàn)程組中的線(xiàn)程。
numThreads = group.enumerate(threads, false);
// 遍歷活動(dòng)線(xiàn)程數(shù)組,打印它們的名字
for (int i=0; i<numThreads; i++) {
// Get thread
Thread thread = threads[i];
for (int j=0; j<level; j++){
System.out.print(" ");
}
System.out.println("" + thread.getName());
}
// 獲取group線(xiàn)程組中活動(dòng)子線(xiàn)程組的估計(jì)數(shù)
int numGroups = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[numGroups];
// 把對(duì)此線(xiàn)程組中的所有活動(dòng)子組的引用復(fù)制到指定數(shù)組中。
numGroups = group.enumerate(groups, false);
// 遞歸的訪(fǎng)問(wèn)子線(xiàn)程組中的線(xiàn)程
for (int i=0; i<numGroups; i++) {
visit(groups[i], level+1);
}
}
/**
* @param args
*/
public static void main(String[] args) {
//建立一個(gè)線(xiàn)程組
ThreadGroup group1 = new ThreadGroup("ThreadGroup-1");
//建立3個(gè)線(xiàn)程并啟動(dòng)
Thread[] threads1 = new Thread[3];
for (int i=1; i<4; i++){
//新的線(xiàn)程屬于group1線(xiàn)程組,以ThreadA為運(yùn)行對(duì)象,名字為"group1-ThreadA-i"
threads1[i-1] = new Thread(group1, new ThreadA(i*2000), "group1-ThreadA-" + i);
threads1[i-1].start();
}
//建立另一個(gè)線(xiàn)程組,屬于group1線(xiàn)程組
ThreadGroup group2 = new ThreadGroup(group1, "ThreadGroup-2");
//建立3個(gè)線(xiàn)程并啟動(dòng)
Thread[] threads2 = new Thread[3];
for (int i=1; i<4; i++){
//新的線(xiàn)程屬于group2線(xiàn)程組,以ThreadA為運(yùn)行對(duì)象,名字為"group2-ThreadA-i"
threads2[i-1] = new Thread(group2, new ThreadA(i*1000), "group2-ThreadA-" + i);
threads2[i-1].start();
}
//列出所有活動(dòng)的線(xiàn)程的名字
System.out.println("當(dāng)前虛擬機(jī)中所有正在運(yùn)行的線(xiàn)程:");
ListAllRunningThread.list();
}
static class ThreadA extends Thread{
private long sleepTime = 100;
public ThreadA(long time){
this.sleepTime = time;
}
public void run(){
try {
Thread.sleep(this.sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
--
學(xué)海無(wú)涯