日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS:多线程的详细介绍

發(fā)布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS:多线程的详细介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
多線程: 一、概念 1、什么是進程? ? ??程序的一次性執(zhí)行就是進程。進程占獨立的內(nèi)存空間。 ? 2、什么是線程? ? ??進程中的代碼的執(zhí)行路徑。 ? 3、進程與線程之間的關(guān)系? ?????每個進程都要創(chuàng)建一個線程,叫主線程。主線程是其他所有線程的父線程。多個線程共享進程之間的內(nèi)存空間。 ? 4、單核與多核處理器下多線程的不同? ? ???單核處理器:一個cpu是分時間片輪流執(zhí)行不同的線程,在切換線程時需要保存和恢復系線程的上下文(cpu中寄存器的內(nèi)容)。 ? ? ?多核處理器:多個cpu可以同時執(zhí)行不同的線程。 ? 5、多線程中線程同步的問題? ? ? ?多個線程對同一資源出現(xiàn)競爭的情況下會出現(xiàn)線程同步的問題。 ? ? ?解決辦法:加鎖lock、條件condition、信號量semaphore(生產(chǎn)者消費者問題) ?

二、3種多線程技術(shù)對比

1.NSThread 2.NSOperation 3.GCD —— Grand?Central?Dispatch,是基于C語言的框架

以上這三種編程方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單,也是Apple最推薦使用的。但是就目前而言,iOS的開發(fā)者,需要了解三種多線程技術(shù)的基本使用過程。因為很多框架技術(shù)分別使用了不同多線程技術(shù)。例如NSURLConnection的異步靜態(tài)方法:sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

?NSThread: 優(yōu)點:NSThread?比其他兩個輕量級,使用簡單 缺點:需要自己管理線程的生命周期、線程同步。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷 ?NSOperation: 不需要關(guān)心線程管理,數(shù)據(jù)同步的事情,可以把精力放在自己需要執(zhí)行的操作上 ?GCD: Grand Central?Dispatch是由蘋果開發(fā)的一個多核編程的解決方案。iOS4.0+才能使用,是替代NSThread,?NSOperation的高效和強大的技術(shù),用途廣泛,蘋果公司極力推崇的一個框架。 ? ? ?

三、創(chuàng)建線程的主要3種方式

? ? ???創(chuàng)建線程方法: 1.+?(void)detachNewThreadSelector:(SEL)selector?toTarget:(id)target?withObject:(id)argument; 2.- (id)initWithTarget:(id)target?selector:(SEL)selector?object:(id)argument; 3.繼承NSThread類,然后在子類中重寫父類的執(zhí)行線程的main方法。 ? ?參數(shù)說明: selector:線程執(zhí)行的方法,只能有一個參數(shù),不能有返回值 target:selector消息發(fā)送的對象 argument:傳輸給target的唯一參數(shù),也可以是nil ?NSObject直接加入了多線程的支持,允許對象的某個方法在后臺運行(本方法普遍應用在游戲中,利用多線程播放聲音) ?- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg; ?

四、NSThread的使用

?當涉及到共享資源爭奪時,共享資源的數(shù)據(jù)加鎖是一個難點,既要保證數(shù)據(jù)安全,又要保證線程執(zhí)行效率 –使用前加鎖 –盡快使用 –使用完解鎖 –再去做其他的事情 ?多線程編寫順序 1.單個方法調(diào)試OK 2.單個線程調(diào)試OK 3.增加線程,并考慮線程加鎖、解鎖的準確位置。 ?注意: –只有主線程能夠修改UI –如果不涉及到內(nèi)存爭搶,NSThread寫多線程是最簡單的 ? ?當不涉及共享資源爭奪時,使用NSObject的performSelectorInBackground方法可以非常的方便地實現(xiàn)多線程 ?

五、?NSOperation?&?NSOperationQueue的使用? ? ?

?NSOperation的兩個子類 1.NSInvocationOperation 2.NSBlockOperation 3.子類化NSOperation,然后重寫main方法 ?工作原理: 1.用NSOperation封裝要執(zhí)行的操作 2.將創(chuàng)建好的NSOperation對象放NSOperationQueue中 3.啟動OperationQueue開始新的線程執(zhí)行隊列中的操作 ?注意事項: 1.使用多線程時通常需要控制線程的并發(fā)數(shù),因為線程會消耗系統(tǒng)資源,同時運行的線程過多,系統(tǒng)會變慢 2.使用以下方法可以控制并發(fā)的線程數(shù)量:

- (void)setMaxConcurrentOperationCount:(NSInteger)cnt

?使用小結(jié):

?NSOperation中無需使用線程鎖

?除更新UI之外,對共享資源的爭奪也需放在主線程隊列之中

?將定義的操作添加至隊列之后,多線程便開始啟動

?NSBlockOperation的使用相比NSInvocationOperation更加靈活、方便

?通過setMaxConcurrentOperationCount方法可以控制并發(fā)的最大線程數(shù)量

六、GCD的使用

?GCD是基于C語言的框架 ?工作原理: –讓程序平行排隊的特定任務,根據(jù)可用的處理資源,安排它們在任何可用的處理器上執(zhí)行任務 –要執(zhí)行的任務可以是一個函數(shù)或者一個block –底層是通過線程實現(xiàn)的,不過程序員可以不必關(guān)注實現(xiàn)的細節(jié) –GCD中的FIFO隊列稱為dispatch queue,可以保證先進來的任務先得到執(zhí)行 –dispatch__notify可以實現(xiàn)監(jiān)聽一組任務是否完成,完成后得到通知 ?dispatch?queue: 1.Main dispatch queue:是全局可用的隊列,用于在主線程上執(zhí)行任務 2.Serial:同時只執(zhí)行一個任務 3.Concurrent:可以并發(fā)地執(zhí)行多個任務,但是執(zhí)行完成的順序是隨機的 ? ?使用小結(jié): ?GCD的原理和Operation非常相像,只是它是C語言架構(gòu)的。 ?GCD中無需使用線程鎖 ?除更新UI之外,對共享資源的爭奪也需放在主調(diào)度隊列之中 ?將任務添加至群組,并指定全局操作隊列,使得GCD的多線程更加靈活、方便 ?dispatch_group_notify可以監(jiān)聽一組任務是否完成。這個方法很有用,比如你執(zhí)行三個下載任務,當三個任務都下載完成后,才通知界面說已經(jīng)完成 ?如果不需要監(jiān)聽一組任務,可以直接使用dispatch_async方法

最后建議:

?關(guān)于多線程必須記住的三個要點 –只能在主線程中更新UI –共享數(shù)據(jù)爭奪的處理 –不要使用多種多線程技術(shù)去爭奪同一個資源! ?在使用多線程的時候,是為了處理并發(fā)操作的。如果有可能,我們不要去做搶資源的事情!

?

? 程序猿神奇的手,每時每刻,這雙手都在改變著世界的交互方式! 分類:?iOS高級
本文轉(zhuǎn)自當天真遇到現(xiàn)實博客園博客,原文鏈接:http://www.cnblogs.com/XYQ-208910/p/4856923.html,如需轉(zhuǎn)載請自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的iOS:多线程的详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。