Java多執行緒可以分組,還能這樣玩!
前面的文章,棧長和大家分享過多執行緒建立的3種方式《 ofollow,noindex" target="_blank">實現 Java 多執行緒的 3 種方式 》。
但如果執行緒很多的情況下,你知道如何對它們進行分組嗎?
和 Dubbo 的服務分組一樣,Java 可以對相同性質的執行緒進行分組。
來看下執行緒類 Thread 的所有構造方法。

如圖所示,帶有 ThreadGroup 的所有執行緒構造方法都可以定義執行緒組的。
執行緒組使用 java.lang.ThreadGroup 類定義,它有兩個構造方法,第二個構造方法允許執行緒組有父類執行緒組,也就是說一個執行緒組可以多個子執行緒組。
java.lang.ThreadGroup#ThreadGroup(java.lang.String)
java.lang.ThreadGroup#ThreadGroup(java.lang.ThreadGroup, java.lang.String)
執行緒組中比較有用的幾個方法。
// 獲取當前執行緒組內的執行執行緒數java.lang.ThreadGroup#activeCount // 中斷執行緒組內的所有執行緒java.lang.ThreadGroup#interrupt // 使用 System.out 打印出所有執行緒資訊java.lang.ThreadGroup#list()
我們來簡單使用下執行緒組吧!
/**
* 微信公眾號:Java技術棧
*/
public static void main(String[] args) {
Runnable runnable = () -> {
System.out.println("Java技術棧執行緒執行緒組名稱:" + Thread.currentThread().getThreadGroup());
System.out.println("Java技術棧執行緒執行緒名稱:" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
ThreadGroup userGroup = new ThreadGroup("user");
userGroup.setMaxPriority(Thread.MIN_PRIORITY);
Thread userTask1 = new Thread(userGroup, runnable, "user-task1");
Thread userTask2 = new Thread(userGroup, runnable, "user-task2");
userTask1.start();
userTask2.start();
System.out.println("Java技術棧執行緒執行緒組活躍執行緒數:" + userGroup.activeCount());
userGroup.list();
}
程式輸出以下結果。
Java技術棧執行緒執行緒組名稱:java.lang.ThreadGroup[name=user,maxpri=1]
Java技術棧執行緒執行緒名稱:user-task1
Java技術棧執行緒執行緒組活躍執行緒數:2
Java技術棧執行緒執行緒組名稱:java.lang.ThreadGroup[name=user,maxpri=1]
Java技術棧執行緒執行緒名稱:user-task2
java.lang.ThreadGroup[name=user,maxpri=1]
Thread[user-task1,1,user]
Thread[user-task2,1,user]
根據示例程式碼和程式輸出結果應該對執行緒組有了一個大概的瞭解吧。
執行緒組還能統一設定組內所有執行緒的最高優先順序,執行緒單獨設定的優先順序不會高於執行緒組設定的最大優先順序。
另外,執行緒組中有一個 stop 方法用來終止組內所有的執行緒,但這個方法和 Thread 中的 stop 方法一樣會帶來很多問題,所以它們兩個現在都已經被廢棄了,官方也是不建議使用了,建議使用執行緒中斷功能進行優雅終止執行緒。
原文釋出時間為:2018-11-09