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