国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS iPhone操作隊列 VS Java線程池

2019-11-09 16:47:01
字體:
來源:轉載
供稿:網友

引言

在涉及多線程并發操作時,如何管理多線程對共享數據的訪問以及防止線程間的死鎖問題是個很重要的話題。在 java 語言中,從Java 5 開始, Java 提供了自己的線程池 ThreadPoolExecutor 類;在 iphone 中則提供了 NSOperationQueue 類進行多線程的管理和調度。

 

什么是線程池?

線程池到底是怎么一回事呢?其實線程池的原理很簡單,類似于操作系統中的緩沖區的概念,它的典型的執行流程如下:

首先,啟動若干數量的線程,并讓這些線程處于睡眠狀態

其次,當客戶端有新的請求時,線程池會喚醒某一個睡眠線程,讓它來處理客戶端的請求

最后,當請求處理完畢,線程又處于睡眠狀態

 

Java 線程池

線程池可以由程序員自己來實現,但是從 Java 5 開始, Java 語言自帶了線程池的類 ThreadPoolExecutor ,這個類提供了典型的線程池管理的接口,來研究 ThreadPoolExecutor 類的實現無疑更有借鑒意義。

ThreadPoolExcutor 類常用的構造方式為

 

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

參數 corePoolSize 為線程池維護線程的最少數量

參數 maximumPoolSize 為線程池維護線程的最大數量

參數 keepAliveTime 為線程池維護線程所允許的空閑時間

參數 unit 為線程池維護線程所允許的空閑時間的單位

參數 workQueue 為線程池所使用的緩沖隊列

參數 handler 為線程池對拒絕任務的處理句柄

 

一個任務可以通過 excute(Runnable) 方法被添加到線程池,任務就是一個實現了 Runnable 接口的對象,而線程池通過 Runnable 類型對象的 run() 方法來執行任務。

 

典型的用法如下:

首先,構造一個線程池

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

而線程池所要執行的任務對象需要實現 Runnable 接口,線程池執行任務對象時調用任務對象的 run() 方法,它的實現代碼如下:

public class ThreadPoolTask implements Runnable{    ThreadPoolTask(){}    public void run(){         System.out.println(“start execute”);    }}

iPhone 操作隊列

iPhone 本身也支持多線程開發,同樣, NSThread 類提供對多線程開發的支持時也面臨多線程的共享數據管理和死鎖問題,于是iPhone 也提供了類似于 Java 線程池的解決方案:任務隊列 NSOperationQueue 類。

和 Java 語言的 Runnable 接口一樣, iPhone 提供了 NSOperation 接口進行任務對象的封裝,而通過將任務對象加入到NSOperationQueue 隊列, NSOperationQueue 隊列會分配線程進行任務對象的執行,任務對象的執行通過 - (void)main 方法,下面是典型的任務對象和任務隊列的實現:

@interface ThreadPoolTask:NSOperation{}@end @implementation ThreadPoolTask- (void)main{    NSLog(@”start execute”);}@end

和 Java 語言中一樣,構造一個多線程池并添加任務對象到線程池中,線程池會調用任務對象的 - (void)main 方法執行任務, iPhone中典型的任務隊列的實現如下:

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 通過 NSOperationQueue 提供了一套類似于線程池的機制,通過它可以更加方便的進行多線程的并發操作,從而使得程序員從繁雜的多線程共享數據管理和死鎖問題中解脫出來。

轉自:http://blog.csdn.net/dongfengsun/article/details/6130683 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 郧西县| 定安县| 西华县| 西青区| 榆社县| 富锦市| 吉木萨尔县| 台北市| 东阿县| 车致| 葫芦岛市| 交口县| 沾化县| 福建省| 麻城市| 隆昌县| 乌审旗| 邢台县| 湘西| 梁河县| 长岛县| 射阳县| 涪陵区| 视频| 靖江市| 湘西| 万全县| 庆阳市| 渝北区| 当雄县| 东山县| 资源县| 崇礼县| 林口县| 石台县| 新泰市| 建宁县| 应城市| 永州市| 西盟| 松潘县|