本文主要是講述iOS多線程pthread與NSTread,更多IOS技術知識,請登陸瘋狂軟件教育官網。 簡介 恰當?shù)氖褂枚嗑€程編程可以提供任務的執(zhí)行效率和系統(tǒng)資源的利用率 多線程是為了提高資源利用率,和應用程序的響應速度,多個線程共享應用資源 每個應用程序都有一個主線程,通常用來做UI界面刷新等 比較耗時的任務如果放在主線程中,可能會造成主線程的堵塞,無法響應用戶操作,通常為耗時任務創(chuàng)建自己的線程,與主線程并發(fā)執(zhí)行 多線程編程在一定程度上提高了系統(tǒng)資源的利用率和任務處理速度,但是線程不易過多,否則會引發(fā)以下問題。 過多的線程會造成處理機的頻繁調度,線程調度需要消耗大量的系統(tǒng)資源。 同一進程下的多個線程共享進程的資源,多個線程對資源的訪問需要實現(xiàn)同步,若線程過多會增加同步的難度,甚至無法實現(xiàn)。 iOS開發(fā)中實現(xiàn)多線程的方式 pthread 跨平臺,適用于多種操作系統(tǒng),可移植性強 是一套純C語言的通用API,且線程的生命周期需要程序員自己管理,使用難度較大,通常不使用 NSThread 基于OC語言的API,使得其簡單易用,面向對象操作 線程的聲明周期由程序員管理,偶爾使用 GCD 基于C語言的API,充分利用設備的多核,旨在替換NSThread等線程技術 線程的生命周期,由系統(tǒng)自動管理,經常使用 NSOperation 基于OC語言API,底層是GCD,增加了一些更加簡單易用的功能,使用更加面向對象 線程生命周期由系統(tǒng)自動管理,經常使用 pthread 創(chuàng)建線程 定義線程變量: pthread_t thread 初始化線程變量: pthread_create(&thread, NULL, run, NULL) 設置/獲取線程的并發(fā)執(zhí)行數(shù) 設置并發(fā)執(zhí)行數(shù): int pthread_setconcurrency(int) 獲取線程的并發(fā)執(zhí)行數(shù): int pthread_getconcurrency(void) 執(zhí)行單次任務(通常用來設計單例模式) 定義標記: pthread_once_t onceToken 執(zhí)行單次任務: int pthread_once(pthread_once_t *, void (*)(void)) 將線程狀態(tài)轉化為unjoinable狀態(tài),確保資源的釋放 int pthread_detach(pthread_t) 退出線程 void pthread_exit(void *) NSThread 線程的生命周期操作 創(chuàng)建線程的方法 - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument,此方法創(chuàng)建 的線程需要手動啟動 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument,創(chuàng)建線 程后自動啟動 - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg,隱式創(chuàng)建線程并啟動 配置線程 通過name屬性設置線程名字 + (BOOL)setThreadPriority:(double)p設置線程的優(yōu)先級 啟動線程 - (void)start 阻塞線程 + (void)sleepUntilDate:(NSDate *)date + (void)sleepForTimeInterval:(NSTimeInterval)ti 取消線程 - (void)cancel,當前正在執(zhí)行的線程不會立刻停止 強制退出線程 + (void)exit NSThread的其他操作 與主線程相關 + (NSThread *)mainThread,獲取主線程 + (BOOL)isMainThread,判斷當前線程是不是主線程 與當前線程相關 + (NSThread *)currentThread,獲取當前線程 判斷線程的狀態(tài) \通過executing屬性判斷線程是否正在執(zhí)行 \通過finished屬性判斷線程是否執(zhí)行完畢 \通過cancelled屬性判斷線程是否被取消 線程同步 原因:多個線程訪問同一資源,很可能會引起數(shù)據(jù)錯亂和數(shù)據(jù)安全問題 解決方案:使用互斥鎖來解決互斥資源訪問問題,iOS中通常使用@synchronized(鎖){}對臨界資源進行鎖定,通常使用self作為鎖 注意:由于線程同步會消耗大量的資源,應盡量避免多個線程訪問同一資源,且通常將線程同步的邏輯交由服務器端實現(xiàn) 線程之間的通信 從子線程回到主線程 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array array指定runLoop的模式,若為空,則不執(zhí)行aselector 方法的調用者即為aselector的調用者 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 從一個線程到另一個線程(包括主線程) - (void)performSelector:(SEL)aSelector onThread:(NSThread )thr withObject:(id)arg waitUntilDone: (BOOL)wait modes:(NSArray )array - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait 也可以通過NSPort對象實現(xiàn)通信 瘋狂軟件教育擁有最專業(yè)的瘋狂iOS學習線路圖,不僅證明瘋狂軟件iOS無與倫比的課程深度,也證明了瘋狂軟件iOS深厚的技術底蘊;同時也指引了iOS學習者的自學方向。iOS培訓采用全新的iMac蘋果一體機教學,瘋狂軟件教育重點培養(yǎng)學員理解軟件開發(fā)過程,形成良好的編碼習慣,能獨立完成iPhone手機和iPad平板電腦上App 開發(fā),積累一定的項目經驗,能滿足企業(yè)對iOS相關的人才需求,短期內成就高薪iOS開發(fā)人才。如需了解更多,可以咨詢QQ:544627560搶座熱線:020-28309358 咨詢QQ:707552864可登陸瘋狂軟件教育官網查詢。
|
|
來自: 最初九月雪 > 《NSRunLoop和mode》