1. 程式人生 > >Java多執行緒學習與總結(ThreadGroup)

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: 測試異常