大可制作:QQ群:31564239(asp|jsp|php|mysql)

Java Gossip: ThreadGroup

在Java中每个线程都属于某个“线程群组”(ThreadGroup)管理的一员,例如若您是在main ()主工作流程中产生一个线程,则产生的线程属于main这个线程群组管理的一员,您可以使用下面的指令来取得目前线程所属的线程群组名称::
Thread.currentThread().getThreadGroup().getName();
 
每一个线程产生时,都会被归入某个线程群组,这视您的线程是在哪个群组中产生,如果没有指定,则归入产生该子线程的线程群组中,您也可以自行指定线程群组,线程一但归入某个群组,就无法更换群组。

ThreadGroup正如其名,可以统一管理整个群组中的线程,您可以使用以下的方式来产生群组,并在产生线程的时候,一并指定其群组:
ThreadGroup threadGroup1 = new ThreadGroup("group1");
ThreadGroup threadGroup2 = new ThreadGroup("group2");
       
Thread thread1 =
           new Thread(threadGroup1, "group1's member");
Thread thread2 =
           new Thread(threadGroup2, "group2's member");
 

ThreadGroup中的某些方法,可以对所有的线程产生作用,例如interrupt()可以interrupt群组中所有的线程, setMaxPriority()可以设定群组中线程所能拥有的最大优先权(本来就拥有更高优先权的线程不受影响),这方面您可以查询线上API文件 来了解有哪些方法可以使用。

如果我们想要一次取得群组中所有的线程进行操作,您可以使用enumerate()方法,例如:
Thread[] threads = new Thread[threadGroup1.activeCount()];
threadGroup1.enumerate(threads);
 

activeCount()方法取得群组中作用中的线程数量,enumerate()方法要传入一个Thread数组对象,它会将线程对象设定至每个数组栏位中,之后您就可以指定数组索引来操作这些线程。

ThreadGroup中有个uncaughtException()方法,这是当群组中某个线程发生unchecked异常时,由执行环境调用此方法进行处理,如果有必要,您可以覆盖此方法,一个例子如下:

  • ThreadGroupDemo.java
package onlyfun.caterpillar;

import java.io.*;

public class ThreadGroupDemo {
public static void main(String[] args) {
ThreadGroup threadGroup1 =
// 这是匿名类写法
new ThreadGroup("group1") {
// 继承ThreadGroup并覆盖以下方法
// 在线程成员丢出unchecked exception
// 会执行此方法
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t.getName() + ": "
+ e.getMessage());
}
};

// 这是匿名类写法
Thread thread1 =
// 这个线程是threadGroup1的一员
new Thread(threadGroup1,
new Runnable() {
public void run() {
// 丢出unchecked异常
throw new RuntimeException("测试异常");
}
});

thread1.start();
}
}

在uncaughtException()方法的参数中,第一个参数可以取得发生异常的线程实例,而第二个参数可以取得异常对象,范例中显示了线程的名称及异常讯息,结果如下所示:
Thread-0: 测试异常