Java多线程学习与总结(ThreadGroup)

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

Java代码 复制代码 收藏代码
  1. Thread.currentThread().getThreadGroup().getName();
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 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()方法可以设置线程组中线程所能拥有的最高优先权(本来就拥有更高优先权的线程不受影响)。
如果您想要一次获得线程组中所有的线程来进行某种操作,可以使用enumerate()方法,例如:

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

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

范例15.9 ThreadGroupDemo.java

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

猜你喜欢

转载自blog.csdn.net/Gavinlib/article/details/8731994