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