iPhone操作隊(duì)列 VS Java線(xiàn)程池
點(diǎn)擊:1773
A+ A-
所屬頻道:新聞中心
引言
在涉及多線(xiàn)程并發(fā)操作時(shí),如何管理多線(xiàn)程對(duì)共享數(shù)據(jù)的訪問(wèn)以及防止線(xiàn)程間的死鎖問(wèn)題是個(gè)很重要的話(huà)題。在 Java 語(yǔ)言中,從 Java 5 開(kāi)始, Java 提供了自己的線(xiàn)程池 ThreadPoolExecutor 類(lèi);在 iPhone 中則提供了 NSOperationQueue 類(lèi)進(jìn)行多線(xiàn)程的管理和調(diào)度。
什么是線(xiàn)程池?
線(xiàn)程池到底是怎么一回事呢?其實(shí)線(xiàn)程池的原理很簡(jiǎn)單,類(lèi)似于操作系統(tǒng)中的緩沖區(qū)的概念,它的典型的執(zhí)行流程如下:
首先,啟動(dòng)若干數(shù)量的線(xiàn)程,并讓這些線(xiàn)程處于睡眠狀態(tài)
其次,當(dāng)客戶(hù)端有新的請(qǐng)求時(shí),線(xiàn)程池會(huì)喚醒某一個(gè)睡眠線(xiàn)程,讓它來(lái)處理客戶(hù)端的請(qǐng)求
最后,當(dāng)請(qǐng)求處理完畢,線(xiàn)程又處于睡眠狀態(tài)
Java 線(xiàn)程池
線(xiàn)程池可以由程序員自己來(lái)實(shí)現(xiàn),但是從 Java 5 開(kāi)始, Java 語(yǔ)言自帶了線(xiàn)程池的類(lèi) ThreadPoolExecutor ,這個(gè)類(lèi)提供了典型的線(xiàn)程池管理的接口,來(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 為線(xiàn)程池維護(hù)線(xiàn)程的最少數(shù)量
參數(shù) maximumPoolSize 為線(xiàn)程池維護(hù)線(xiàn)程的最大數(shù)量
參數(shù) keepAliveTime 為線(xiàn)程池維護(hù)線(xiàn)程所允許的空閑時(shí)間
參數(shù) unit 為線(xiàn)程池維護(hù)線(xiàn)程所允許的空閑時(shí)間的單位
參數(shù) workQueue 為線(xiàn)程池所使用的緩沖隊(duì)列
參數(shù) handler 為線(xiàn)程池對(duì)拒絕任務(wù)的處理句柄
一個(gè)任務(wù)可以通過(guò) excute(Runnable) 方法被添加到線(xiàn)程池,任務(wù)就是一個(gè)實(shí)現(xiàn)了 Runnable 接口的對(duì)象,而線(xiàn)程池通過(guò) Runnable 類(lèi)型對(duì)象的 run() 方法來(lái)執(zhí)行任務(wù)。
典型的用法如下:
首先,構(gòu)造一個(gè)線(xiàn)程池
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();
}
而線(xiàn)程池所要執(zhí)行的任務(wù)對(duì)象需要實(shí)現(xiàn) Runnable 接口,線(xiàn)程池執(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 本身也支持多線(xiàn)程開(kāi)發(fā),同樣, NSThread 類(lèi)提供對(duì)多線(xiàn)程開(kāi)發(fā)的支持時(shí)也面臨多線(xiàn)程的共享數(shù)據(jù)管理和死鎖問(wèn)題,于是 iPhone 也提供了類(lèi)似于 Java 線(xiàn)程池的解決方案:任務(wù)隊(duì)列 NSOperationQueue 類(lèi)。
和 Java 語(yǔ)言的 Runnable 接口一樣, iPhone 提供了 NSOperation 接口進(jìn)行任務(wù)對(duì)象的封裝,而通過(guò)將任務(wù)對(duì)象加入到 NSOperationQueue 隊(duì)列, NSOperationQueue 隊(duì)列會(huì)分配線(xiàn)程進(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è)多線(xiàn)程池并添加任務(wù)對(duì)象到線(xiàn)程池中,線(xiàn)程池會(huì)調(diào)用任務(wù)對(duì)象的 - (void)main 方法執(zhí)行任務(wù), iPhone 中典型的任務(wù)隊(duì)列的實(shí)現(xiàn)如下:
NSOperationQueue* threadPool = [[NSOperation alloc] init];
?。踭hreadPool setMaxConcurrentOperationCount:4];
for(int i = 1;i 《= 5;i++)
{
NSString* task = [NSString stringWithFormat:@”task %d”,i];
NSLog(@“put %@”,task);
?。踭hreadPool add:([[ThreadPoolTask alloc] init])];
}
可以看到, iPhone 通過(guò) NSOperationQueue 提供了一套類(lèi)似于線(xiàn)程池的機(jī)制,通過(guò)它可以更加方便的進(jìn)行多線(xiàn)程的并發(fā)操作,從而使得程序員從繁雜的多線(xiàn)程共享數(shù)據(jù)管理和死鎖問(wèn)題中解脫出來(lái)。
(審核編輯: 智匯小新)
分享