Java多執行緒學習與總結(ThreadGroup)
阿新 • • 發佈:2018-11-01
在Java中每個執行緒都屬於某個執行緒組(ThreadGroup)。例如,如果在main()中產生一個執行緒,則這個執行緒屬於main執行緒組管理的一員,您可以使用下面的指令來獲得目前執行緒所屬的執行緒組名稱:
Java程式碼- Thread.currentThread().getThreadGroup().getName();
Thread.currentThread().getThreadGroup().getName();
一個執行緒產生時,都會被歸入某個執行緒組,視執行緒是在哪個執行緒組中產生而定。如果沒有指定,則歸入產生該子執行緒的執行緒組中。您也可以自行指定執行緒組,執行緒一旦歸入某個組,就無法更換組。
java.lang.ThreadGroup類正如其名,可以統一管理整個執行緒組中的執行緒,您可以使用以下方式來產生執行緒組,而且一併指定其執行緒組:
Java程式碼- 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 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()方法,例如:
- Thread[] threads = new Thread[threadGroup1.activeCount()];
- 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程式碼- 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();
- }
- }
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: 測試異常 |