從性能的角度看,如果沒有任務會阻塞,那麼在單處理器機器上使用併發就沒有任何意義。
像java所使用的併發系統會共享諸如內存和I/O這樣的資源,因此編寫多線程程序最基本的困難在於在協調不同線程驅動的任務之間對這些資源的使用,以使得這些資源不會同時被對歌任務訪問。
Thread Group
java中每個線程都屬於一個線程組,線程組提供了一個將多個線程組織成一個線程組對象來管理的機制,如可以通過一個方法調用來啓動線程組中的所有線程。
1 create
線 程組是由java.lang 包 中的ThreadGroup 類 實現的。它的構造方法如下:
· public ThreadGroup(String name)
· public ThreadGroup(ThreadGroup parent, String name)
name 爲線程組名,parent 爲線程組的父線程組,若無該參數則新建線程組的 父線程組爲當前運行的線程的線程組。
創建線程時可以明確指定新建線程屬於哪個線程組,若沒有明確指定則放入缺省線程組中。一旦線程被指定 屬於哪個線程組,便不能改變,不能刪除。
2 default group
如果在創建線程時沒有在構造方法中指定所屬線程組,運行時系統會自動將該線程放入創建該線程的線程所屬的線程組中。那麼當我們創建線程時沒有指定線程組,它 屬於哪個線程組呢?
當Java 應用程序啓動時,Java 運行時系統創建一個名main 的ThreadGroup 對象。除非另外指定,否則所有新建線程 都屬於main 線程組 的成員。
如 下面代碼創建的myThread 線 程屬於myThreadGroup 線 程組。
ThreadGroup myGroup = new ThreadGroup("My Group of Threads");
Thread myThread = new Thread(myGroup, "a thread for my group");
爲 了得到線程所屬的線程組可以調用Thread 的getThreadGroup() 方法,該方法返回ThreadGroup 對象。可以通過下面方法獲得線程所屬 線程組名。
myThread.getThreadGroup().getName()
一 旦得到了線程組對象,就可查詢線程組的有關信息,如線程組中其他線程、也可僅通過調用一個方法就可實現修改線程組中的線程,如掛起、恢復或停止線程。
3 線程組操作方法
線 程組類提供了有關方法可以對線程組操作。
· public final String getName() 返回線程組名。
· public final ThreadGroup getParent() 返回線程組的父線程組對象。
· public final void setMaxPriority(int pri) 設置線程組的最大優先級。線程組中的線程不能超過 該優先級。
· public final int getMaxPriority() 返回線程組的最大優先級。
· public boolean isDestroyed() 測試該線程組對象是否已被銷燬。
· public int activeCount() 返回該線程組中活動線程的估計數。
· public int activeGroupCount() 返回該線程組中活動線程組的估計數。
· public final void destroy() 銷燬該線程組及其子線程組對象。當前線程組的所有線程必須已經停止。