Java多線程能夠分組,還能這樣玩!

前面的文章,棧長和你們分享過多線程建立的3種方式《實現 Java 多線程的 3 種方式》。java

但若是線程不少的狀況下,你知道如何對它們進行分組嗎?微信

和 Dubbo 的服務分組同樣,Java 能夠對相同性質的線程進行分組。多線程

來看下線程類 Thread 的全部構造方法。spa

如圖所示,帶有 ThreadGroup 的全部線程構造方法均可以定義線程組的。線程

線程組使用 java.lang.ThreadGroup 類定義,它有兩個構造方法,第二個構造方法容許線程組有父類線程組,也就是說一個線程組能夠多個子線程組。code

java.lang.ThreadGroup#ThreadGroup(java.lang.String)
java.lang.ThreadGroup#ThreadGroup(java.lang.ThreadGroup, java.lang.String)

線程組中比較有用的幾個方法。rem

// 獲取當前線程組內的運行線程數
java.lang.ThreadGroup#activeCount

// 中斷線程組內的全部線程
java.lang.ThreadGroup#interruptget

// 使用 System.out 打印出全部線程信息
java.lang.ThreadGroup#list()it

咱們來簡單使用下線程組吧!io

/**
 * 微信公衆號: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 方法同樣會帶來不少問題,因此它們兩個如今都已經被廢棄了,官方也是不建議使用了,建議使用線程中斷功能進行優雅終止線程。


更多 Java 多線程技術文章請在微信公衆號後臺回覆關鍵字:多線程。

本文原創首發於微信公衆號:Java技術棧(id:javastack),關注公衆號在後臺回覆 "java" 可獲取更多,轉載請原樣保留本信息。

相關文章
相關標籤/搜索