java編程思想讀書筆記----線程組的控制__編程

來源:互聯網
上載者:User
線程組的控制
拋開安全問題不談,線程組最有用的一個地方就是控制:只需用單個命令即可完成對整個線程組的操作。下
面這個例子示範了這一點,並對線程組內優先順序的限制進行了說明。括弧內的注釋數字便於大家比較輸出結
果:
//: ThreadGroup1.java
// How thread groups control priorities
// of the threads inside them.
public class ThreadGroup1 {
public static void main(String[] args) {
// Get the system thread & print its Info:
ThreadGroup sys =
Thread.currentThread().getThreadGroup();
sys.list(); // (1)
// Reduce the system thread group priority:
sys.setMaxPriority(Thread.MAX_PRIORITY - 1);
// Increase the main thread priority:
Thread curr = Thread.currentThread();
curr.setPriority(curr.getPriority() + 1);
sys.list(); // (2)
// Attempt to set a new group to the max:
ThreadGroup g1 = new ThreadGroup("g1");
g1.setMaxPriority(Thread.MAX_PRIORITY);
// Attempt to set a new thread to the max:
Thread t = new Thread(g1, "A");
t.setPriority(Thread.MAX_PRIORITY);
g1.list(); // (3)
// Reduce g1's max priority, then attempt
// to increase it:
g1.setMaxPriority(Thread.MAX_PRIORITY - 2);
g1.setMaxPriority(Thread.MAX_PRIORITY);
g1.list(); // (4)
// Attempt to set a new thread to the max:
t = new Thread(g1, "B");
t.setPriority(Thread.MAX_PRIORITY);
g1.list(); // (5)
// Lower the max priority below the default
// thread priority:
g1.setMaxPriority(Thread.MIN_PRIORITY + 2);
// Look at a new thread's priority before
// and after changing it:
t = new Thread(g1, "C");
g1.list(); // (6)
t.setPriority(t.getPriority() -1);
g1.list(); // (7)
// Make g2 a child Threadgroup of g1 and
// try to increase its priority:
ThreadGroup g2 = new ThreadGroup(g1, "g2");
g2.list(); // (8)
g2.setMaxPriority(Thread.MAX_PRIORITY);
528
g2.list(); // (9)
// Add a bunch of new threads to g2:
for (int i = 0; i < 5; i++)
new Thread(g2, Integer.toString(i));
// Show information about all threadgroups
// and threads:
sys.list(); // (10)
System.out.println("Starting all threads:");
Thread[] all = new Thread[sys.activeCount()];
sys.enumerate(all);
for(int i = 0; i < all.length; i++)
if(!all[i].isAlive())
all[i].start();
// Suspends & Stops all threads in
// this group and its subgroups:
System.out.println("All threads started");
sys.suspend(); // Deprecated in Java 1.2
// Never gets here...
System.out.println("All threads suspended");
sys.stop(); // Deprecated in Java 1.2
System.out.println("All threads stopped");
}
} ///:~
下面的輸出結果已進行了適當的編輯,以便用一頁能夠裝下(java.lang.已被刪去),而且添加了適當的數
字,與前面程式列表中括弧裡的數字對應:
(1) ThreadGroup[name=system,maxpri=10]
Thread[main,5,system]
(2) ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
(3) ThreadGroup[name=g1,maxpri=9]
Thread[A,9,g1]
(4) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
(5) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
Thread[B,8,g1]
(6) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,6,g1]
(7) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,3,g1]
(8) ThreadGroup[name=g2,maxpri=3]
(9) ThreadGroup[name=g2,maxpri=3]
(10)ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
529
Thread[B,8,g1]
Thread[C,3,g1]
ThreadGroup[name=g2,maxpri=3]
Thread[0,6,g2]
Thread[1,6,g2]
Thread[2,6,g2]
Thread[3,6,g2]
Thread[4,6,g2]
Starting all threads:
All threads started
所有程式都至少有一個線程在運行,而且main()採取的第一項行動便是調用Thread 的一個static(靜態)
方法,名為currentThread()。從這個線程開始,線程組將被建立,而且會為結果調用list()。輸出如下:
(1) ThreadGroup[name=system,maxpri=10]
Thread[main,5,system]
我們可以看到,主線程組的名字是system,而主線程的名字是main,而且它從屬於system 線程組。
第二個練習顯示出system 組的最高優先順序可以減少,而且main 線程可以增大自己的優先順序:
(2) ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
第三個練習建立一個新的線程組,名為g1;它自動從屬於system 線程組,因為並沒有明確指定它的歸屬關
系。我們在g1 內部放置了一個新線程,名為A。隨後,我們試著將這個組的最大優先順序設到最高的層級,並
將A 的優先順序也設到最高一級。結果如下:
(3) ThreadGroup[name=g1,maxpri=9]
Thread[A,9,g1]
可以看出,不可能將線程組的最大優先順序設為高於它的父線程組。
第四個練習將g1 的最大優先順序降低兩級,然後試著把它升至Thread.MAX_PRIORITY。結果如下:
(4) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
同樣可以看出,提高最大優先順序的企圖是失敗的。我們只能降低一個線程組的最大優先順序,而不能提高它。
此外,注意線程A 的優先順序並未改變,而且它現在高於線程組的最大優先順序。也就是說,線程組最大優先順序
的變化並不能對現有線程造成影響。
第五個練習試著將一個新線程設為最大優先順序。如下所示:
(5) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
Thread[B,8,g1]
因此,新線程不能變到比最大線程組優先順序還要高的一級。
這個程式的預設線程優先順序是6;若建立一個線程,那就是它的預設優先順序,而且不會發生變化,除非對優
先級進行了特別的處理。練習六將把線程組的最大優先順序降至預設線程優先順序以下,看看在這種情況下建立
一個線程會發生什麼事情:
(6) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
530
Thread[B,8,g1]
Thread[C,6,g1]
儘管線程組現在的最大優先順序是3,但仍然用預設優先順序6 來建立新線程。所以,線程組的最大優先順序不會
影響預設優先順序(事實上,似乎沒有辦法可以設定新線程的預設優先順序)。
改變了優先順序後,接下來試試將其降低一級,結果如下:
(7) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,3,g1]
因此,只有在試圖改變優先順序的時候,才會強迫遵守線程組最大優先順序的限制。
我們在(8)和(9)中進行了類似的實驗。在這裡,我們建立了一個新的線程組,名為g2,將其作為g1 的一個
子組,並改變了它的最大優先順序。大家可以看到,g2 的優先順序無論如何都不可能高於g1:
(8) ThreadGroup[name=g2,maxpri=3]
(9) ThreadGroup[name=g2,maxpri=3]
也要注意在g2 建立的時候,它會被自動設為g1 的線程組最大優先順序。
經過所有這些實驗以後,整個線程組和線程系統都會被列印出來,如下所示:
(10)ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,3,g1]
ThreadGroup[name=g2,maxpri=3]
Thread[0,6,g2]
Thread[1,6,g2]
Thread[2,6,g2]
Thread[3,6,g2]
Thread[4,6,g2]
所以由線程組的規則所限,一個子組的最大優先順序在任何時候都只能低於或等於它的父組的最大優先順序。
本程式的最後一個部分示範了用於整組線程的方法。程式首先遍曆整個線程樹,並啟動每一個尚未啟動的線
程。例如,system 組隨後會被掛起(暫停),最後被中止(儘管用suspend()和stop()對整個線程組進行操
作看起來似乎很有趣,但應注意這些方法在Java 1.2 裡都是被“反對”的)。但在掛起system 組的同時,
也掛起了main 線程,而且整個程式都會關閉。所以永遠不會達到讓線程中止的那一步。實際上,假如真的中
止了main 線程,它會“擲”出一個ThreadDeath 違例,所以我們通常不這樣做。由於ThreadGroup 是從
Object 繼承的,其中包含了wait()方法,所以也能調用wait(秒數×1000),令程式暫停運行任意秒數的時
間。當然,事前必須在一個同步塊裡取得對象鎖。
ThreadGroup 類也提供了suspend()和resume()方法,所以能中止和啟動整個線程組和它的所有線程,也能
中止和啟動它的子組,所有這些只需一個命令即可(再次提醒,suspend()和resume()都是Java 1.2 所“反
對”的)。
從表面看,線程組似乎有些讓人摸不著頭腦,但請注意我們很少需要直接使用它們。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.