監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢(xún)管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 簽約案例 | 購(gòu)買(mǎi)價(jià)格 | 在線試用 | 手機(jī)APP | 產(chǎn)品資料
X 關(guān)閉

iPhone操作隊(duì)列 VS Java線程池

申請(qǐng)免費(fèi)試用、咨詢(xún)電話:400-8352-114

 

作者 孫東風(fēng) 2011-1-12 轉(zhuǎn)載請(qǐng)注明出處

 

引言

在涉及多線程并發(fā)操作時(shí),如何管理多線程對(duì)共享數(shù)據(jù)的訪問(wèn)以及防止線程間的死鎖問(wèn)題是個(gè)很重要的話題。在 Java 語(yǔ)言中,從 Java 5 開(kāi)始, Java 提供了自己的線程池 ThreadPoolExecutor 類(lèi);在 iPhone 中則提供了 NSOperationQueue 類(lèi)進(jìn)行多線程的管理和調(diào)度。

 

什么是線程池?

線程池到底是怎么一回事呢?其實(shí)線程池的原理很簡(jiǎn)單,類(lèi)似于操作系統(tǒng)中的緩沖區(qū)的概念,它的典型的執(zhí)行流程如下:

首先,啟動(dòng)若干數(shù)量的線程,并讓這些線程處于睡眠狀態(tài)

其次,當(dāng)客戶(hù)端有新的請(qǐng)求時(shí),線程池會(huì)喚醒某一個(gè)睡眠線程,讓它來(lái)處理客戶(hù)端的請(qǐng)求

最后,當(dāng)請(qǐng)求處理完畢,線程又處于睡眠狀態(tài)

 

Java 線程池

線程池可以由程序員自己來(lái)實(shí)現(xiàn),但是從 Java 5 開(kāi)始, Java 語(yǔ)言自帶了線程池的類(lèi) ThreadPoolExecutor ,這個(gè)類(lèi)提供了典型的線程池管理的接口,來(lái)研究 ThreadPoolExecutor 類(lèi)的實(shí)現(xiàn)無(wú)疑更有借鑒意義。

ThreadPoolExcutor 類(lèi)常用的構(gòu)造方式為

 

ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler)

參數(shù) corePoolSize 為線程池維護(hù)線程的最少數(shù)量

參數(shù) maximumPoolSize 為線程池維護(hù)線程的最大數(shù)量

參數(shù) keepAliveTime 為線程池維護(hù)線程所允許的空閑時(shí)間

參數(shù) unit 為線程池維護(hù)線程所允許的空閑時(shí)間的單位

參數(shù) workQueue 為線程池所使用的緩沖隊(duì)列

參數(shù) handler 為線程池對(duì)拒絕任務(wù)的處理句柄

 

一個(gè)任務(wù)可以通過(guò) excute(Runnable) 方法被添加到線程池,任務(wù)就是一個(gè)實(shí)現(xiàn)了 Runnable 接口的對(duì)象,而線程池通過(guò) Runnable 類(lèi)型對(duì)象的 run() 方法來(lái)執(zhí)行任務(wù)。

 

典型的用法如下:

首先,構(gòu)造一個(gè)線程池

ThreadPoolExecutor threadPool =

new ThreadPoolExecutor(2,4,3,TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(3),new ThreadPoolExecutor.DiscardOldestPolicy());

 

for(int i = 1;i <= 5;i++)

{

     try

{

     String task = “task@”+i;

     System.out.println(“put”+task);

     threadPool.execute(new ThreadPoolTask());

}

}

catch(Exception e)

{

     e.printStackTrace();

}

而線程池所要執(zhí)行的任務(wù)對(duì)象需要實(shí)現(xiàn) Runnable 接口,線程池執(zhí)行任務(wù)對(duì)象時(shí)調(diào)用任務(wù)對(duì)象的 run() 方法,它的實(shí)現(xiàn)代碼如下:

public class ThreadPoolTask implements Runnable{

ThreadPoolTask(){}

public void run(){

     System.out.println(“start execute”);

}

}

 

iPhone 操作隊(duì)列

iPhone 本身也支持多線程開(kāi)發(fā),同樣, NSThread 類(lèi)提供對(duì)多線程開(kāi)發(fā)的支持時(shí)也面臨多線程的共享數(shù)據(jù)管理和死鎖問(wèn)題,于是 iPhone 也提供了類(lèi)似于 Java 線程池的解決方案:任務(wù)隊(duì)列 NSOperationQueue 類(lèi)。

和 Java 語(yǔ)言的 Runnable 接口一樣, iPhone 提供了 NSOperation 接口進(jìn)行任務(wù)對(duì)象的封裝,而通過(guò)將任務(wù)對(duì)象加入到 NSOperationQueue 隊(duì)列, NSOperationQueue 隊(duì)列會(huì)分配線程進(jìn)行任務(wù)對(duì)象的執(zhí)行,任務(wù)對(duì)象的執(zhí)行通過(guò) - (void)main 方法,下面是典型的任務(wù)對(duì)象和任務(wù)隊(duì)列的實(shí)現(xiàn):

@interface ThreadPoolTask:NSOperation

{

}

@end

 

@implementation ThreadPoolTask

- (void)main

{

  NSLog(@”start execute”);

}

@end

和 Java 語(yǔ)言中一樣,構(gòu)造一個(gè)多線程池并添加任務(wù)對(duì)象到線程池中,線程池會(huì)調(diào)用任務(wù)對(duì)象的 - (void)main 方法執(zhí)行任務(wù), iPhone 中典型的任務(wù)隊(duì)列的實(shí)現(xiàn)如下:

 

NSOperationQueue* threadPool = [[NSOperation alloc] init];

[threadPool setMaxConcurrentOperationCount:4];

for(int i = 1;i <= 5;i++)

{        

NSString* task = [NSString stringWithFormat:@”task %d”,i];

NSLog(@“put %@”,task);

[threadPool add:([[ThreadPoolTask alloc] init])];

}

可以看到, iPhone 通過(guò) NSOperationQueue 提供了一套類(lèi)似于線程池的機(jī)制,通過(guò)它可以更加方便的進(jìn)行多線程的并發(fā)操作,從而使得程序員從繁雜的多線程共享數(shù)據(jù)管理和死鎖問(wèn)題中解脫出來(lái)。

 




發(fā)布:2007-04-16 17:23    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]

泛普入庫(kù)出庫(kù)管理軟件其他應(yīng)用

藥品進(jìn)銷(xiāo)存管理系統(tǒng) 醫(yī)藥進(jìn)銷(xiāo)存 超市進(jìn)銷(xiāo)存管理系統(tǒng) 服裝進(jìn)銷(xiāo)存軟件 倉(cāng)庫(kù)進(jìn)銷(xiāo)存管理軟件 進(jìn)銷(xiāo)存財(cái)務(wù)軟件 傻瓜進(jìn)銷(xiāo)存 萬(wàn)能進(jìn)銷(xiāo)存軟件 進(jìn)銷(xiāo)存網(wǎng)絡(luò)版 進(jìn)銷(xiāo)存管理系統(tǒng) 進(jìn)銷(xiāo)存系統(tǒng) 服裝庫(kù)存管理軟件 條碼倉(cāng)庫(kù)管理軟件 庫(kù)存管理軟件 倉(cāng)庫(kù)管理軟件 庫(kù)房管理軟件 出入庫(kù)管理軟件 倉(cāng)儲(chǔ)管理系統(tǒng) 倉(cāng)庫(kù)管理系統(tǒng) 庫(kù)存管理系統(tǒng) 入庫(kù)出庫(kù)管理軟件 進(jìn)銷(xiāo)存軟件排名 倉(cāng)庫(kù)管理軟件哪個(gè)好