|
作者孫東風(fēng)2011-1-12轉(zhuǎn)載請注明出處引言在涉及多線程并發(fā)操作時(shí),如何管理多線程對共享數(shù)據(jù)的訪問以及防止線程間的死鎖問題是個(gè)很重要的話題。在Java語言中,從Java5開始,Java提供了自己的線程池ThreadPoolExecutor類;在iPhone中則提供了NSOperationQueue類進(jìn)行多線程的管理和調(diào)度。什么是線程池?線程池到底是怎么一回事呢?其實(shí)線程池的原理很簡單,類似于操作系統(tǒng)中的緩沖區(qū)的概念,它的典型的執(zhí)行流程如下:首先,啟動若干數(shù)量的線程,并讓這些線程處于睡眠狀態(tài)其次,當(dāng)客戶端有新的請求時(shí),線程池會喚醒某一個(gè)睡眠線程,讓它來處理客戶端的請求最后,當(dāng)請求處理完畢,線程又處于睡眠狀態(tài)Java線程池線程池可以由程序員自己來實(shí)現(xiàn),但是從Java5開始,Java語言自帶了線程池的類ThreadPoolExecutor,這個(gè)類提供了典型的線程池管理的接口,來研究ThreadPoolExecutor類的實(shí)現(xiàn)無疑更有借鑒意義。ThreadPoolExcutor類常用的構(gòu)造方式為ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueRunnableworkQueue,RejectedExecutionHandlerhandler)參數(shù)corePoolSize為線程池維護(hù)線程的最少數(shù)量參數(shù)maximumPoolSize為線程池維護(hù)線程的最大數(shù)量參數(shù)keepAliveTime為線程池維護(hù)線程所允許的空閑時(shí)間參數(shù)unit為線程池維護(hù)線程所允許的空閑時(shí)間的單位參數(shù)workQueue為線程池所使用的緩沖隊(duì)列參數(shù)handler為線程池對拒絕任務(wù)的處理句柄一個(gè)任務(wù)可以通過excute(Runnable)方法被添加到線程池,任務(wù)就是一個(gè)實(shí)現(xiàn)了Runnable接口的對象,而線程池通過Runnable類型對象的run()方法來執(zhí)行任務(wù)。典型的用法如下:首先,構(gòu)造一個(gè)線程池ThreadPoolExecutorthreadPool=newThreadPoolExecutor(2,4,3,TimeUnit.SECONDS,newArrayBlockingQueueRunnable(3),newThreadPoolExecutor.DiscardOldestPolicy());for(inti=1;i=5;i++){try{Stringtask=“task@”+i;System.out.println(“put”+task);threadPool.execute(newThreadPoolTask());}}catch(Exceptione){e.printStackTrace();}而線程池所要執(zhí)行的任務(wù)對象需要實(shí)現(xiàn)Runnable接口,線程池執(zhí)行任務(wù)對象時(shí)調(diào)用任務(wù)對象的run()方法,它的實(shí)現(xiàn)代碼如下:publicclassThreadPoolTaskimplementsRunnable{ThreadPoolTask(){}publicvoidrun(){System.out.println(“startexecute”);}}iPhone操作隊(duì)列iPhone本身也支持多線程開發(fā),同樣,NSThread類提供對多線程開發(fā)的支持時(shí)也面臨多線程的共享數(shù)據(jù)管理和死鎖問題,于是iPhone也提供了類似于Java線程池的解決方案:任務(wù)隊(duì)列NSOperationQueue類。和Java語言的Runnable接口一樣,iPhone提供了NSOperation接口進(jìn)行任務(wù)對象的封裝,而通過將任務(wù)對象加入到NSOperationQueue隊(duì)列,NSOperationQueue隊(duì)列會分配線程進(jìn)行任務(wù)對象的執(zhí)行,任務(wù)對象的執(zhí)行通過-(void)main方法,下面是典型的任務(wù)對象和任務(wù)隊(duì)列的實(shí)現(xiàn):@interfaceThreadPoolTask:NSOperation{}@end@implementationThreadPoolTask-(void)main{NSLog(@”startexecute”);}@end和Java語言中一樣,構(gòu)造一個(gè)多線程池并添加任務(wù)對象到線程池中,線程池會調(diào)用任務(wù)對象的-(void)main方法執(zhí)行任務(wù),iPhone中典型的任務(wù)隊(duì)列的實(shí)現(xiàn)如下:NSOperationQueue*threadPool=[[NSOperationalloc]init];[threadPoolsetMaxConcurrentOperationCount:4];for(inti=1;i=5;i++){NSString*task=[NSStringstringWithFormat:@”task%d”,i];NSLog(@“put%@”,task);[threadPooladd:([[ThreadPoolTaskalloc]init])];}可以看到,iPhone通過NSOperationQueue提供了一套類似于線程池的機(jī)制,通過它可以更加方便的進(jìn)行多線程的并發(fā)操作,從而使得程序員從繁雜的多線程共享數(shù)據(jù)管理和死鎖問題中解脫出來。
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|