1. 程式人生 > >執行緒組threadgroup、執行緒池threadpool

執行緒組threadgroup、執行緒池threadpool

基礎概念(百科)

在Java中每一個執行緒都歸屬於某個執行緒組管理的一員,例如在主函式main()主工作流程中產生一個執行緒,則產生的執行緒屬於main這個執行緒組管理的一員。簡單地說,執行緒組(ThreadGroup)就是由執行緒組成的管理執行緒的類,這個類是java.lang.ThreadGroup類。
定義一個執行緒組,通過以下程式碼可以實現。
ThreadGroup group=new ThreadGroup("group");
Thread thread=new Thread(group,"the first thread of group");
ThreadGroup類中的某些方法,可以對執行緒組中的執行緒產生作用。例如,setMaxPriority()方法可以設定執行緒組中的所有執行緒擁有最大的優先權。
所有執行緒都隸屬於一個執行緒組。那可以是一個預設執行緒組,亦可是一個建立執行緒時明確指定的組。在建立之初,執行緒被限制到一個組裡,而且不能改變到一個不同的組。每個應用都至少有一個執行緒從屬於系統執行緒組。若建立多個執行緒而不指定一個組,它們就會自動歸屬於系統執行緒組。
執行緒組也必須從屬於其他執行緒組。必須在構建器裡指定新執行緒組從屬於哪個執行緒組。若在建立一個執行緒組的時候沒有指定它的歸屬,則同樣會自動成為系統執行緒組的一名屬下。因此,一個應用程式中的所有執行緒組最終都會將系統執行緒組作為自己的“父”
之所以要提出“執行緒組”的概念,一般認為,是由於“安全”或者“保密”方面的理由。根據Arnold和Gosling的說法:“執行緒組中的執行緒可以修改組內的其他執行緒,包括那些位於分層結構最深處的。一個執行緒不能修改位於自己所在組或者下屬組之外的任何執行緒””(註釋①)
①:《The Java Programming Language》第179頁。該書由Arnold和James Gosling編著,Addison-Wesley於1996年出版

執行緒組函式釋義

轉載:http://blog.csdn.net/i_lovefish/article/details/8042714

①定義執行緒組 
ThreadGroup類中有 2個構造方法,它們用來定義執行緒組。這 2個構造方法的使用格 式如下: 
   
public ThreadGroup(String name); 
   
public ThreadGroup(ThreadGroup parent,String name); 
   
比如,建立一個名為fruit的執行緒組k,可用如下語句: 
   
ThreadGroup k=new ThreadGroup(“fruit”); 
   
如果一個執行緒組有父執行緒組,則可以在定義時,用第二個構造方法指出父執行緒組的名 字。比如: 
   
ThreadGroup k=new ThreadGroup(products,“fruit”); 
②獲得執行緒組中的資訊 
ThreadGroup類中有幾個方法可用來獲得執行緒組中有關執行緒和子執行緒的資訊,這些信 息包括執行緒組名字、執行緒組中可執行執行緒的數目、執行緒組中執行緒的最大優先順序、執行緒組中各 執行緒的名字等。這些方法有: 
       public int activeCount(); // 獲得當前執行緒組中執行緒數目, 包括可執行和不可執行的 
       public int activeGroupCount(); //獲得當前執行緒組中活動的子執行緒組的數目 
       public int enumerate(Thread list[]); //列舉當前執行緒組中的執行緒 
       public int enumerate(ThreadGroup list[]); //列舉當前執行緒組中的子執行緒組 
       public final int getMaxPriority(); //獲得當前執行緒組中最大優先順序 
       public final String getName(); //獲得當前執行緒組的名字 
       public final ThreadGroup getParent(); //獲得當前執行緒組的父執行緒組 
       public boolean parentOf(ThreadGroup g); //判斷當前執行緒組是否為指定執行緒的父執行緒 
       public boolean isDaemon(); //判斷當前執行緒組中是否有監護執行緒 
       public void list(); //列出當前執行緒組中所有執行緒和子執行緒名 
③對執行緒組操作 
    ThreadGroup類中的方法都是以執行緒組為操作目標的。其中,包括設定執行緒組中執行緒 的最大優先順序方法、將執行緒組中所有執行緒掛起或恢復到可執行狀態的方法、終止執行緒組中所 有執行緒的方法等。 
    對執行緒組進行操作的方法如下所示: 
       public final void resume(); //使被掛起的當前組內的執行緒恢復到可執行狀態 
       public final void setDaemon (boolean daemon); //指定一個執行緒為當前執行緒組的監護執行緒 
       public final void setMaxPriority(int pri); //設定當前執行緒組允許的最大優先順序 
       public final void stop();//終止當前執行緒組中所有執行緒 
       public final void suspend(); //掛起當前執行緒組中所有執行緒 
       public String toStrinng(); //將當前執行緒組轉換為String類的物件

執行緒組管理執行緒池範例

/**
 * 當建立了好幾個執行緒的時候,很多執行緒的工作任務是類似或者一致的,這樣我們就可以使用ThreadGroup來管理他
 * 們,ThreadGroup可以隨時的獲取在他裡面的執行緒的執行狀態,資訊,或者一條命令關閉掉這個group裡面的所有線 程,非常的簡單實用
 * 
 * @author Administrator
 * 
 */
public class SearchTask implements Runnable {

	public SearchTask(Result result) {
		this.result = result;
	}

	private Result result;

	@Override
	public void run() {
		String name = Thread.currentThread().getName();
		System.out.println("Thread Start " + name);
		try {
			doTask();
			result.setName(name);
		} catch (InterruptedException e) {
			System.out.printf("Thread %s: Interrupted\n", name);
			return;
		}
		System.out.println("Thread end " + name);
	}

	private void doTask() throws InterruptedException {
		Random random = new Random((new Date()).getTime());
		int value = (int) (random.nextDouble() * 100);
		System.out.printf("Thread %s: %d\n", Thread.currentThread().getName(),
				value);
		TimeUnit.SECONDS.sleep(value);
	}

	public static void main(String[] args) {
		// 建立5個執行緒,併入group裡面進行管理
		ThreadGroup threadGroup = new ThreadGroup("Searcher");
		Result result = new Result();
		SearchTask searchTask = new SearchTask(result);
		for (int i = 0; i < 5; i++) {
			Thread thred = new Thread(threadGroup, searchTask);
			thred.start();
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		// 通過這種方法可以看group裡面的所有資訊
		System.out.printf("Number of Threads: %d\n", threadGroup.activeCount());
		System.out.printf("Information about the Thread Group\n");
		threadGroup.list();

		// 這樣可以複製group裡面的thread資訊
		Thread[] threads = new Thread[threadGroup.activeCount()];
		threadGroup.enumerate(threads);
		for (int i = 0; i < threadGroup.activeCount(); i++) {
			System.out.printf("Thread %s: %s\n", threads[i].getName(),
					threads[i].getState());
		}

		waitFinish(threadGroup);
		// 將group裡面的所有執行緒都給interpet
		threadGroup.interrupt();
	}

	private static void waitFinish(ThreadGroup threadGroup) {
		while (threadGroup.activeCount() > 9) {
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}


執行緒組和執行緒池的區別

二者最直觀的區別是,執行緒池就像一臺水輪機,它的葉片就像執行緒,可以迴圈不停,看起來只要水源不斷,葉片就可以不停的週期性的工作。而執行緒組,只是管理一個或多個執行緒的Manager,而且它所管理的執行緒生命週期一旦結束,將永遠停止,無法週期執行任務.