解析iPhone操作隊列和Java線程池

來源:互聯網
上載者:User

iPhone操作隊列Java線程池是本文要介紹的內容,在涉及多線程並行作業時,如何管理多線程對共用資料的訪問以及防止線程間的死結問題是個很重要的話題。在 Java 語言中,從 Java 5 開始, Java 提供了自己的線程池 ThreadPoolExecutor 類;在 iPhone 中則提供了 NSOperationQueue 類進行多線程的管理和調度。

什麼是線程池?

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

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

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

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

Java 線程池

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

ThreadPoolExcutor 類常用的構造方式為

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

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

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

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

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

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

參數 handler 為線程池對拒絕任務的處理控制代碼

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

典型的用法如下:

首先,構造一個線程池

 
  1. ThreadPoolExecutor threadPool =  
  2. new ThreadPoolExecutor(2,4,3,TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(3),new ThreadPoolExecutor.DiscardOldestPolicy());  
  3. for(int i = 1;i <= 5;i++)  
  4. {  
  5.  
  6.      try  
  7. {  
  8.      String task = “task@”+i;  
  9.      System.out.println(“put”+task);  
  10.      threadPool.execute(new ThreadPoolTask());  
  11. }  
  12. }  
  13. catch(Exception e)  
  14. {  
  15.      e.printStackTrace();  

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

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

iPhone 操作隊列

iPhone 本身也支援多線程開發,同樣, NSThread 類提供對多線程開發的支援時也面臨多線程的共用資料管理和死結問題,於是 iPhone 也提供了類似於 Java 線程池的解決方案:任務隊列 NSOperationQueue 類。

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

 
  1. @interface ThreadPoolTask:NSOperation  
  2. {  
  3. }  
  4. @end  
  5.  
  6. @implementation ThreadPoolTask  
  7. - (void)main  
  8. {  
  9.   NSLog(@”start execute”);  
  10. }  
  11. @end 

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

 
  1. NSOperationQueue* threadPool = [[NSOperation alloc] init];  
  2. [threadPool setMaxConcurrentOperationCount:4];  
  3. for(int i = 1;i <= 5;i++)  
  4. {         
  5. NSString* task = [NSString stringWithFormat:@”task %d”,i];  
  6. NSLog(@“put %@”,task);  
  7. [threadPool add:([[ThreadPoolTask alloc] init])];  

可以看到, iPhone 通過 NSOperationQueue 提供了一套類似於線程池的機制,通過它可以更加方便的進行多線程的並行作業,從而使得程式員從繁雜的多線程共用資料管理和死結問題中解脫出來。

小結:解析iPhone操作隊列和Java線程池的內容介紹完了,希望通過本文對學習能對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.