對于多線程的一些理解

1.PThread : 是一個(gè)C語言的一個(gè)API接口,由于使用難度較大,較為底層。我們在平常開發(fā)的時(shí)候不經(jīng)常使用!
2.NSThread: 是三種方法里面相對輕量級的,但需要管理線程的生命周期、同步、加鎖問題,這會導(dǎo)致一定的性能開銷
3.NSOperation: 是基于OC實(shí)現(xiàn)的,NSOperation以面向?qū)ο蟮姆绞椒庋b了需要執(zhí)行的操作,不必關(guān)心線程管理、同步等問題。NSOperation是一個(gè)抽象基類,iOS提供了兩種默認(rèn)實(shí)現(xiàn):NSInvocationOperation和NSBlockOperation,當(dāng)然也可以自定義NSOperation
4.GCD:提供了一些新特性、運(yùn)行庫來支持多核并行編程,它的關(guān)注點(diǎn)更高:如何在多個(gè)cpu上提升效率

下面主要介紹一些NSThread:

首先NSThread初始化方法:(動(dòng)態(tài)方法)
``
1 - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

``
參數(shù)解析:
selector :線程執(zhí)行的方法,這個(gè)selector最多只能接收一個(gè)參數(shù)

target :selector消息發(fā)送的對象

argument : 傳給selector的唯一參數(shù),也可以是nil
2初始化方法(靜態(tài)方法)
2 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
3 [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; // 調(diào)用完畢后,會馬上創(chuàng)建并開啟新線程

  1. 隱式創(chuàng)建線程的方法
    ``
    4 [self performSelectorInBackground:@selector(run) withObject:nil];

``

獲取當(dāng)前線程
5 NSThread *current = [NSThread currentThread];

獲取主線程
6 NSThread *main = [NSThread mainThread];

暫停線程
// 暫停2s [NSThread sleepForTimeInterval:2]; // 或者 NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]]; [NSThread sleepUntilDate:date];

線程間的通信

  1. 在指定線程上執(zhí)行操作
    [self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];
  2. 在主線程上進(jìn)行操作
    [self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];
  3. 在當(dāng)前線程執(zhí)行操作
    7 [self performSelector:@selector(run) withObject:nil];

優(yōu)缺點(diǎn)
1.優(yōu)點(diǎn):NSThread比其他兩種多線程方案較輕量級,更直觀地控制線程對象
2.缺點(diǎn):需要自己管理線程的生命周期,線程同步。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷

補(bǔ)充一點(diǎn)就是:NSThread有哪幾種狀態(tài),和轉(zhuǎn)換的邏輯

新建->就緒-> cup調(diào)度當(dāng)前任務(wù)->運(yùn)行->阻塞->死亡->CUP調(diào)度其他任務(wù)->就緒
主線程的一些概念:
默認(rèn)啟動(dòng)的線程,也叫作UI線程,用來顯示和刷新UI界面,和處理一些UI事件的。 需要注意的是:不要把耗時(shí)操作放到主線程上去做!UI操作必須在主線程中執(zhí)行 !!!!

說一說如何解決多條線程訪問同一塊資源造成的線程安全的問題,以及一些注意點(diǎn)!

加同步(互斥)鎖 @synchronized OC中的同步鎖:(鎖對象) + {要鎖住的代碼} 鎖對象:要求是全局唯一的屬性 注意點(diǎn): 要注意加鎖的位置 加鎖需要耗費(fèi)性能,因此需要注意加鎖的條件(多線程訪問同一塊資源) 專業(yè)術(shù)語:線程同步

原子和非原子屬性的區(qū)別

atomic:原子屬性,會為setter方法默認(rèn)加鎖,線程是安全的,但是會消耗大量資源! noatomic:非原子屬性,不會為setter方法加鎖。非線程安全,適合內(nèi)存小的移動(dòng)設(shè)備。

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

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

  • 一、多線程基礎(chǔ) 基本概念 進(jìn)程進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用且...
    AlanGe閱讀 647評論 0 0
  • 原文地址 http://www.cnblogs.com/kenshincui/p/3983982.html 大家都...
    怎樣m閱讀 1,421評論 0 1
  • 不知怎么就中了甄嬛傳的毒, 雖然每一年各個(gè)電視臺都會爭先恐后的重播, 每次搖控器一選到正在播的那個(gè)臺, 也不管是正...
    菲荷閱讀 511評論 0 2
  • 臺歷上的日期,過一天,畫一個(gè)圓圈。如果碰到某天心情特別不好,或是遇上一個(gè)倒胃口的曠世奇葩,那么那一天就畫一個(gè)叉。畫...
    不愛跑步的胖橘閱讀 547評論 0 1
  • 穎打來電話,問我什么時(shí)候回老家? 我回:“已經(jīng)回去過了,剛回合肥沒幾天?!?她破口大罵:“葛芳,你太過分了吧!我和...
    葛芳閱讀 263評論 10 8

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