前面的文章,棧長和你們分享過多線程建立的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" 可獲取更多,轉載請原樣保留本信息。