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();
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章