1. 程式人生 > >Java——多執行緒基本使用(四) 執行緒組和執行緒池的使用,工廠設計模式的使用

Java——多執行緒基本使用(四) 執行緒組和執行緒池的使用,工廠設計模式的使用

1.執行緒組的概述和使用

Java中使用ThreadGroup來表示執行緒組,它可以對一批執行緒進行分類管理,Java允許程式直接對執行緒組進行控制。

             (1)預設情況下,所有執行緒都屬於執行緒組

                    public final ThreadGroup getThreadGroup() //通過執行緒物件獲取它所屬於的組

                    public final String getName()      //通過執行緒組物件獲取它組的名字

             (2)自己給執行緒設定分組

                    1)ThreadGroup(String name)  建立執行緒組物件並給其賦值名字

                    2)建立執行緒物件

                    3)Thread(ThreadGroup?group,Runnable?target,String?name)

                    4)設定整組的優先順序或者守護執行緒

2.執行緒的五種狀態

             (1)新建:建立執行緒物件

             (2)就緒:執行緒物件已啟動,但是還沒有獲取到cpu的執行權

             (3)執行:獲取到了cpu的執行權

             (4)阻塞:沒有cpu的執行權,回到就緒

             (5)死亡:程式碼執行完畢,執行緒消亡 

3.執行緒池的概述和使用

           程式啟動一個新執行緒成本使比較高的,因為涉及到與作業系統進行互動。使用執行緒池可以很好的提高效能,尤其是當程式            中要建立大量生存期很短的執行緒時,更應該考慮使用執行緒池。 執行緒池裡的每一個執行緒程式碼結束後,並不會死亡,而是再回            到執行緒池中成為空閒狀態,等待下一個物件來使用。

             (1)JDK5增加了一個Executors工廠類來產生執行緒池,有以下幾個方法

                    public static ExecutorService newFixedThreadPool(int nThreads),放n條執行緒

                    public static ExecutorService newSingleThreadExecutor(int nThreads)

             這些方法的返回值是ExecutorService物件,該物件表示一個執行緒池,可以執行Runnable物件或者Callable物件代表的線                程,它提供瞭如下的方法

                    Future<?> submit(Runnable task)

                    <T> Future<t> submit(Callable<T> task)

             (2)使用步驟

                    1)建立執行緒池物件

                    2)建立Runnable例項

                    3)提交Runnable例項

                    4)關閉執行緒池

4.簡單工廠設計模式的概述和使用

             又叫靜態工廠方法模式,它定義了一個具體的工廠類負責建立一些類的例項

             優點:客戶端不需要在負責物件的建立,從而明確了各個類的指責

             缺點:他負責所有物件的建立,如果有新的物件增加,或者某些物件的建立方式不同,就需要不斷地修改工廠類,不利                於後期地維護

5.工廠方法模式的概述和使用

              工廠方法模式中抽象工廠類負責定義建立物件的介面,具體物件的建立工作由繼承抽象工廠的具體類實現

              優點:客戶端不要在負責物件的建立,從而明確了各個類的職責,如果有新的物件增加,只需要增加一個具體的類和具                 體的工廠類即可,不影響已有程式碼,後期維護容易,增強系統的擴充套件性

             缺點:需要額外的編寫程式碼,增加了工作量

 

package pra_22;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class J_41 {

	/**
	 * @param args
	 * @throws ExecutionException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		//1.執行緒組的使用,能使一組執行緒的狀態發生改變
		MyRun mr=new MyRun();
		Thread t1=new Thread(mr,"aa");
		Thread t2=new Thread(mr,"bb");
		ThreadGroup tg=t1.getThreadGroup();
		ThreadGroup tg2=t2.getThreadGroup();
		System.out.println(tg.getName());		//main
		System.out.println(tg2.getName());		//main
		
		ThreadGroup tg3=new ThreadGroup("new");	//建立新的執行緒組
		MyRun mr2=new MyRun();					//建立Runnable的子類物件
		Thread t3=new Thread(tg3,mr2,"cc");		//將執行緒t3放在組中
		Thread t4=new Thread(tg3,mr2,"dd");	
		System.out.println(t3.getThreadGroup().getName());	//獲取組名
		System.out.println(t4.getThreadGroup().getName());
		
		//2.執行緒池的使用
		/*
		ExecutorService esp=Executors.newFixedThreadPool(2);	//建立執行緒池
		esp.submit(new MyRun());	//將執行緒放進池子裡並執行
		esp.submit(new MyRun());
		esp.shutdown();			//關閉執行緒池
		*/
		
		//3.多執行緒程式實現的方式(使用執行緒池的方法)
		ExecutorService esp2=Executors.newFixedThreadPool(2);
		Future<Integer> f1=esp2.submit(new MyC(10));	
		Future<Integer> f2=esp2.submit(new MyC(100));
		System.out.println(f1.get());
		System.out.println(f2.get());
		esp2.shutdown();
		
		//4.簡單工廠設計模式
		Nurse N=(Nurse)PeopleFac.Createp("nurse");
		N.work();
		Stu s=(Stu)PeopleFac.Createp("stu");
		s.work();
		
		//5.工廠方法設計模式
		StuFac sf=new StuFac();
		Stu s2=(Stu)sf.createP();
		NurseFac nf=new NurseFac();
		Nurse n2=(Nurse) nf.createP();
		s2.work();
		n2.work();
	}	

}
//執行緒組的使用
class MyRun implements Runnable{

	@Override
	public void run() {
		for(int i=0;i<1000;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
	
}
//簡單工廠設計模式
class MyC implements Callable<Integer>{
	private int num;
	public MyC(int num){
		this.num=num;
	}
	@Override
	public Integer call() throws Exception {
		int sum=0;
		for(int i=1;i<num;i++){
			sum+=i;
		}
		return sum;
	}
}
abstract class People{
	public abstract void work();
}
class Stu extends People{

	@Override
	public void work() {
		System.out.println("School");
	}
}
class Nurse extends People{

	@Override
	public void work() {
		System.out.println("hospital");
	}
}
class PeopleFac{
	/*	這樣子會定義很多方法,複用性差
	public static Stu createS(){
		return new Stu();
	}
	public static Nurse createN(){
		return new Nurse();
	}
	*/
	public static People Createp(String name){
		if("stu".equals(name)){
			return new Stu();
		}else if("nurse".equals(name)){
			return new Nurse();
		}else{
			return null;
		}
	}
}
//工廠方法設計模式
interface Fac{
	public People createP();
}
class StuFac implements Fac{

	@Override
	public People createP() {
		
		return new Stu();
	}
}
class NurseFac implements Fac{

	@Override
	public People createP() {
		
		return new Nurse();
	}
}