Java併發編程基礎(四)

ThreadGroup

在主線程建立得線程,若是沒有給他指定線程組,那麼建立的線程,默認和主線程同一個線程組。線程組能夠底下能夠是線程,也能夠實線程組。數組

構建線程組的方法:this

  • private ThreadGroup()線程

  • public ThreadGroup(String name)code

  • public ThreadGroup(ThreadGroup parent, String name)遞歸

  • private ThreadGroup(Void unused, ThreadGroup parent, String name)get

    public class Demo {
     public static void main(String[] args) {
     	//獲取當前線程所屬的線程組
     	ThreadGroup g1 = Thread.currentThread().getThreadGroup();
     	//定義一個線程組
     	ThreadGroup g2 = new ThreadGroup("g2");
     	//判斷當前線程所屬的線程組的父線程
     	System.out.println(g2.getParent()==g1);//true
     	//定義新得線程,在以前得線程組之上
     	ThreadGroup g3 = new ThreadGroup(g2,"g3");
     	System.out.println(g3.getParent()==g2);//true
     }
     }

複製Thread數組和ThreadGroup數組

複製Thread數組

  1. public int enumerate(Thread[] list)源碼

  2. public int enumerate(Thread[] list,boolean recurse)it

上面的兩個方法其實是講ThreadGroup中的active線程所有複製到Thread數組中,其中recurse參數是true,則該方法會將全部的子group的active線程都遞歸到Thread數組中,經過源碼能夠得知enumerate(Thread[],true)==enumerate(list),這兩個方法都是調用的 private int enumerate(Thread list[], int n, boolean recurse)io

public int enumerate(Thread list[]) {
		checkAccess();
		return enumerate(list, 0, true);
	}
	public int enumerate(Thread list[], boolean recurse) {
		checkAccess();
		return enumerate(list, 0, recurse);
	}

 private int enumerate(Thread list[], int n, boolean recurse) {
		int ngroupsSnapshot = 0;
		ThreadGroup[] groupsSnapshot = null;
		synchronized (this) {
			if (destroyed) {
				return 0;
			}
			int nt = nthreads;
			if (nt > list.length - n) {
				nt = list.length - n;
			}
			for (int i = 0; i < nt; i++) {
				if (threads[i].isAlive()) {
					list[n++] = threads[i];
				}
			}
			if (recurse) {
				ngroupsSnapshot = ngroups;
				if (groups != null) {
					groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot);
				} else {
					groupsSnapshot = null;
				}
			}
		}
		if (recurse) {
			for (int i = 0 ; i < ngroupsSnapshot ; i++) {
				n = groupsSnapshot[i].enumerate(list, n, true);
			}
		}
		return n;
	}

執行結果: 3 2class

複製ThreadGroup

  1. public int enumerate(ThreadGroup list[])

  2. public int enumerate(ThreadGroup list[], boolean recurse)

    public class ThreadGroupEnumerateThreadGroupsDemo {
     	public static void main(String[] args) throws InterruptedException {
     		ThreadGroup g1 = new ThreadGroup("g1");
     		ThreadGroup g2 = new ThreadGroup(g1,"g2");
     		TimeUnit.MILLISECONDS.sleep(2);
     		ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
     		ThreadGroup[] list = new ThreadGroup[mainGroup.activeCount()];
     		int recurseSize = mainGroup.enumerate(list);
     		System.out.println(recurseSize);
     		recurseSize = mainGroup.enumerate(list,false);
     		System.out.println(recurseSize);
     	}
     }

執行結果: 2 1

ThreadGroup的基本操做

  • activeGcount()用於獲取group中活躍的線程,這只是個估值。

  • activeGroupCount()用於獲取group中活躍的子group,這也是一個近似估值,該方法也會遞歸獲取全部的子group。

  • getMaxPriority()用於獲取group的優先級,默認狀況下,Group的優先級爲10,在該group中,全部的線程的優先級不能大於group的優先級。

  • getName():或與group的名字。

  • getParent()獲取group的父group,有就返回,沒有就返回null。

  • list():該方法沒有返回值,執行該方法會將group中全部的活躍的線程信息所有輸出到控制檯。

  • parentOf(ThreadGroup g):會判斷當前的group的是否是給定group的父group,另外若是給定大group的是給本身自己,那麼高返回true。

  • setMaxPriority(int pri)會指定group的最大優先級,最大優先級不能超過父group的最大優先級,該方法會把當前的線程組和子線程組的優先級都有影響。

相關文章
相關標籤/搜索