多線程之NSThread

NSThread

優(yōu)點(diǎn):輕量級(jí)的,面向?qū)ο蟮木€程技術(shù),可以直接操作線程對(duì)象

缺點(diǎn):需要程序員管理生命周期,線程同步。線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開(kāi)銷

創(chuàng)建和啟動(dòng)線程

一個(gè)NSThread對(duì)象就代表一個(gè)線程

創(chuàng)建和啟動(dòng)線程

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread start]; // 線程一啟動(dòng),就會(huì)在線程thread中執(zhí)行self的run方法

主線程的相關(guān)用法

其他用法

獲取當(dāng)前線程較為常用打印出來(lái)為 1 或者2 1為主線程 其他的均為子線程

控制線程的狀態(tài)

注:sleepForTimeInterval 設(shè)置阻塞多少秒后進(jìn)入? 一旦線程死亡(停止)了,就不能再次開(kāi)啟任務(wù)

線程的安全隱患

資源共享

1.一塊資源可能被多個(gè)線程共享,也就是多個(gè)線程可能會(huì)訪問(wèn)同一塊資源

2.比如多個(gè)對(duì)象訪問(wèn)統(tǒng)一對(duì)象,同一個(gè)變量,同一個(gè)文件

3.當(dāng)多個(gè)線程訪問(wèn)同一塊資源時(shí),很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問(wèn)題

安全隱患示例1


分析: 一個(gè)存錢的線程,一個(gè)取錢的線程 都對(duì)余額進(jìn)行操作 首先都獲取卡內(nèi)余額為1000, 然后存錢的線程 存1000 余額就為2000 然后取錢線程工作? 開(kāi)始獲取到的余額為1000, 所以直接在1000的基礎(chǔ)上進(jìn)行操作 取500 然后獲取余額? 為500? 莫名奇妙的錢不見(jiàn)了

安全隱患示例2

分析:原理是一樣的 導(dǎo)致的結(jié)果就是票永遠(yuǎn)都賣不完(不懂留言問(wèn)我)

安全隱患的解決--互斥鎖

互斥鎖使用格式

@synchronized(鎖對(duì)象) {//需要鎖定的代碼}

注意:鎖定1份代碼只用1把鎖,用多把鎖是無(wú)效的

互斥鎖的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問(wèn)題

缺點(diǎn):需要消耗大量的CPU資源

互斥鎖的使用前提:多條線程搶奪同一塊資源

相關(guān)專業(yè)術(shù)語(yǔ):線程同步

線程同步的意思是:多條線程在同一條線上執(zhí)行(按順序地執(zhí)行任務(wù))

互斥鎖,就是使用了線程同步技術(shù)

互斥鎖示例

原子性和非原子行

OC在定義屬性時(shí)有nonatomic和atomic兩種選擇

atomic:原子屬性,為setter方法加鎖(默認(rèn)就是atomic)

nonatomic:非原子屬性,不會(huì)為setter方法加鎖

nonatomic和atomic對(duì)比

atomic:線程安全,需要消耗大量的資源

nonatomic:非線程安全,適合內(nèi)存小的移動(dòng)設(shè)備

iOS開(kāi)發(fā)的建議

所有屬性都聲明為nonatomic

盡量避免多線程搶奪同一塊資源

盡量將加鎖、資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器端處理,減小移動(dòng)客戶端的壓力

線程間的通信

什么叫做線程間通信

在1個(gè)進(jìn)程中,線程往往不是孤立存在的,多個(gè)線程之間需要經(jīng)常進(jìn)行通信

線程間通信的體現(xiàn)

1個(gè)線程傳遞數(shù)據(jù)給另1個(gè)線程

在1個(gè)線程中執(zhí)行完特定任務(wù)后,轉(zhuǎn)到另1個(gè)線程繼續(xù)執(zhí)行任務(wù)

線程間通信常用方法

1.-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone (BOOL)wait;

2.-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

線程間通信示例 – 圖片下載

線程間通信方式 – 利用NSPort

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容