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
