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