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

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

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

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

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

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

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

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

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

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

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


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

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

相關文章
相關標籤/搜索