线程组 可以捕获子线程异常

在Java中每个线程都属于某个线程组(ThreadGroup)。例如,如果在main()中产生一个线程,则这个线程属于main线程组管理的一员,您可以使用下面的指令来获得目前线程所属的线程组名称:

Java代码   收藏代码
  1. Thread.currentThread().getThreadGroup().getName();  

     一个线程产生时,都会被归入某个线程组,视线程是在哪个线程组中产生而定。如果没有指定,则归入产生该子线程的线程组中。您也可以自行指定线程组,线程一旦归入某个组,就无法更换组。

    java.lang.ThreadGroup类正如其名,可以统一管理整个线程组中的线程,您可以使用以下方式来产生线程组,而且一并指定其线程组:

Java代码   收藏代码
  1. ThreadGroup threadGroup1 = new ThreadGroup("group1");  
  2. ThreadGroup threadGroup2 = new ThreadGroup("group2");  
  3. Thread thread1 =  
  4. new Thread(threadGroup1, "group1's member");  
  5. Thread thread2 =  
  6. new Thread(threadGroup2, "group2's member");  

     ThreadGroup中的某些方法,可以对所有的线程产生作用,例如interrupt()方法可以interrupt线程组中所有的线程,setMaxPriority()方法可以设置线程组中线程所能拥有的最高优先权(本来就拥有更高优先权的线程不受影响)。
    如果您想要一次获得线程组中所有的线程来进行某种操作,可以使用enumerate()方法,例如:

Java代码   收藏代码
  1. Thread[] threads = new Thread[threadGroup1.activeCount()];  
  2. threadGroup1.enumerate(threads);  

     ThreadGroup中有一个uncaughtException()方法。当线程组中某个线程发生Unchecked exception异常时,由执行环境调用此方法进行相关处理,如果有必要,您可以重新定义此方法,直接使用范例15.9来示范如何实现。

范例15.9  ThreadGroupDemo.java

 

范例15.9 threadgroupdemo.java代码   收藏代码
  1. package onlyfun.caterpillar;  
  2.   
  3. import java.io.*;  
  4.   
  5. public class ThreadGroupDemo {  
  6. public static void main(String[] args) {  
  7. ThreadGroup threadGroup1 =  
  8. // 这是匿名类写法  
  9. new ThreadGroup("group1") {  
  10. // 继承ThreadGroup并重新定义以下方法  
  11. // 在线程成员抛出unchecked exception  
  12. // 会执行此方法  
  13. public void uncaughtException(Thread t, Throwable e) {  
  14. System.out.println(t.getName() + ": "  
  15. + e.getMessage());  
  16. }  
  17. };  
  18.   
  19.         // 这是匿名类写法  
  20. Thread thread1 =  
  21. // 这个线程是threadGroup1的一员  
  22. new Thread(threadGroup1,  
  23. new Runnable() {  
  24. public void run() {  
  25. // 抛出unchecked异常  
  26. throw new RuntimeException("测试异常");  
  27. }  
  28. });  
  29.   
  30.         thread1.start();  
  31. }  
  32. }  

 

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

Thread-0: 测试异常

你可能感兴趣的:(线程)