iOS多線程之NSThread (一)

NSThread:

NSThread 是一個(gè)控制線程執(zhí)行的對(duì)象惠桃,它不如 NSOperation抽象浦夷,通過(guò)它我們可以方便的得到一個(gè)線程,并控制它刽射,但NSThread的線程之間的并發(fā)控制是需要我們自己來(lái)控制的军拟,可以通NSCondition [k?n'di??n]實(shí)現(xiàn)。
在Cocoa的框架下誓禁,通知懈息、Timer和異步函數(shù)等都有使用多線程,(待補(bǔ)充)

使用 NSThread實(shí)現(xiàn)多線程

iOS使用 NSThread 類代表線程摹恰,創(chuàng)建新的線程也就是創(chuàng)建 NSThread對(duì)象
創(chuàng)建 NSThread 線程有兩種方式:

// - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument NS_AVAILABLE(10_5, 2_0);//創(chuàng)建一個(gè)新的線程對(duì)象辫继。
//+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument; //創(chuàng)建并啟動(dòng)線程 (d??t?t? 分離派遣)

上面兩種方式的本質(zhì)都是將 Target對(duì)象的selector方法 轉(zhuǎn)化為 線程執(zhí)行體,其中selector方法最多可以接受一個(gè)參數(shù)俗慈,而argument(?ɑ?ɡj?m(?)nt 理由 主題)就代表傳給selector方法的參數(shù)
target對(duì)象的 selector方法體代表了線程需要完成的任務(wù)姑宽,因此相當(dāng)于把 target對(duì)象的 Selector方法轉(zhuǎn)換為線程執(zhí)行體。
啟動(dòng)線程使用 start 方法之后,該線程立即進(jìn)入就緒狀態(tài)(相當(dāng)于“等待執(zhí)行”)闺阱,并不是立即進(jìn)入運(yùn)行狀態(tài)炮车,線程啟動(dòng)后處于就緒狀態(tài),當(dāng)系統(tǒng)調(diào)度線程后酣溃,線程才會(huì)進(jìn)入運(yùn)行狀態(tài)瘦穆。

如果程序希望調(diào)用子線程的start 方法后子線程立即開(kāi)始執(zhí)行,程序可以使用 [NSThread sleepForTimeInterval:0.001];讓當(dāng)前運(yùn)行的線程(主線程)睡眠1毫秒

終止子線程

線程會(huì)以以下三種方式之一結(jié)束,結(jié)束后就處于死亡狀態(tài),
1.線程執(zhí)行體方法執(zhí)行完成,線程正常結(jié)束,
2.線程執(zhí)行過(guò)程中出現(xiàn)了錯(cuò)誤
3.直接調(diào)用NSThread類的 exit (??ks?t)方法來(lái)終止當(dāng)前正在執(zhí)行的線程赊豌;

注:當(dāng)主線程結(jié)束時(shí),其它線程不受任何影響,并不會(huì)隨著結(jié)束扛或。一旦子線程啟動(dòng)起來(lái)后,他就擁有了和主線程相同的地位,它不受主線程的影響。

當(dāng)線程正處于執(zhí)行的過(guò)程中時(shí)候碘饼,調(diào)用isExecuting (??ks??kjut 執(zhí)行)熙兔,就會(huì)返回YES ;當(dāng)線程執(zhí)行完成后,調(diào)用isFinished 方法 就會(huì)返回YES

NSThread的多線程技術(shù)悲伶,

主要是利用NSThread這個(gè)類,一個(gè)NSThread實(shí)例 代表著 一條線程
一住涉、NSthread的初始化
1> 靜態(tài)方法 類方法直接開(kāi)啟后臺(tái)線程麸锉,并執(zhí)行選擇器方法 (d??t?t? 使…分開(kāi))
//創(chuàng)建完畢后,會(huì)馬上創(chuàng)建并開(kāi)啟新的線程

+(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;
// 新建一個(gè)線程舆声,調(diào)用@selector方法
[NSThread detachNewThreadSelector:@selector(run1) toTarget:self withObject:nil];

2> 動(dòng)態(tài)方法 成員方法淮椰,在實(shí)例化線程對(duì)象之后,需要使用start執(zhí)行選擇器方法:

+(instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument NS_AVAILABLE(10_5, 2_0);
參數(shù)解析:
selector :線程執(zhí)行的方法纳寂,這個(gè)selector最多只能接收一個(gè)參數(shù),
target:selector消息發(fā)送的對(duì)象,
argument (?ɑ?gj?m?nt): 傳給selector的唯一參數(shù),也可以是nil;

// 初始化線程
    NSThread * run1Thread = [[NSThread alloc]initWithTarget:self selector:@selector(run1) object:nil];
    // 設(shè)置當(dāng)前線程的優(yōu)先級(jí)(pra???r?ti  0.0 - 1.0, 1.0最高級(jí))
    run1Thread.threadPriority = 0.3;
    // 開(kāi)啟線程
    [run1Thread start];
    // (?tɑ?ɡ?t,目標(biāo))
    NSThread * run2Thread = [[NSThread alloc]initWithTarget:self selector:@selector(run2) object:nil];
    run2Thread.threadPriority = 1.0;
    [run2Thread start];
    
    // 隱式創(chuàng)建線程的方法
    [self performSelectorInBackground:@selector(run3) withObject:nil];
    // 對(duì)于NSThread的簡(jiǎn)單使用泻拦,可以用NSObject的performSelectorInBackground替代 (p??f??m 做)
    // performSelectorInBackground是將run3的任務(wù)放在后臺(tái)線程中執(zhí)行
    
    // 同時(shí)毙芜,在NSThread調(diào)用的方法中,同樣要使用autoreleasepool進(jìn)行內(nèi)存管理争拐,否則容易出現(xiàn)內(nèi)存泄露腋粥。
    // 自動(dòng)釋放池
    // 負(fù)責(zé)其他線程上的內(nèi)存管理,在使用NSThread或者NSObject的線程方法時(shí)架曹,一定要使用自動(dòng)釋放池
    // 否則容易出現(xiàn)內(nèi)存泄露隘冲。
    // @autoreleasepool { }
    
    // 獲取當(dāng)前的線程
    NSThread * current = [NSThread currentThread];
    NSLog(@"=========%@",current);
    // currentThread; 該方法總是返回當(dāng)前正在執(zhí)行的線程對(duì)象。
    NSLog( @"++++++++%@",[NSThread currentThread]);
    
    // 獲取主線程
    NSThread * main = [NSThread mainThread];
    NSLog(@"--------%@",main);
    
    // 暫停當(dāng)前線程   暫停兩秒
    [NSThread sleepForTimeInterval:2];
    //  或者
    NSDate * date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];
    [NSThread sleepUntilDate:date];
    
    //    線程之間的通信
    //    1在指定的線程上執(zhí)行的操作
    [self performSelector:@selector(run4) onThread:current withObject:nil waitUntilDone:YES];
    
    //    2在主線程上執(zhí)行的操作
    [self performSelectorOnMainThread:@selector(run5) withObject:nil waitUntilDone:YES];
    
    //    3在當(dāng)前線程執(zhí)行操作
    [self performSelector:@selector(run6) withObject:nil];
    

    for (int i = 0; i<15; i++) {
        if (i == 10) {
            //創(chuàng)建線程對(duì)象
            NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
            //啟動(dòng)線程  必須調(diào)用start 方法啟動(dòng)線程绑雄,
            [thread start];
            NSLog( @"---%@,i=%d",[NSThread currentThread],i);
            //創(chuàng)建并啟動(dòng)線程  直接創(chuàng)建 不會(huì)返回 NSThread 對(duì)象展辞,// d??t?t? 分離派遣
            [NSThread detachNewThreadSelector:@selector(run7) toTarget:self withObject:nil];
        }
    }
圖片.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市万牺,隨后出現(xiàn)的幾起案子罗珍,更是在濱河造成了極大的恐慌,老刑警劉巖脚粟,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件覆旱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡核无,警方通過(guò)查閱死者的電腦和手機(jī)扣唱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)团南,“玉大人,你說(shuō)我怎么就攤上這事已慢∏簦” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵朋腋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我仲墨,道長(zhǎng)癌蚁,這世上最難降的妖魔是什么幻梯? 我笑而不...
    開(kāi)封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮努释,結(jié)果婚禮上碘梢,老公的妹妹穿的比我還像新娘。我一直安慰自己伐蒂,他們只是感情好煞躬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著逸邦,像睡著了一般汰翠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昭雌,一...
    開(kāi)封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天复唤,我揣著相機(jī)與錄音,去河邊找鬼烛卧。 笑死佛纫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的总放。 我是一名探鬼主播呈宇,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼局雄!你這毒婦竟也來(lái)了甥啄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炬搭,失蹤者是張志新(化名)和其女友劉穎蜈漓,沒(méi)想到半個(gè)月后穆桂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡融虽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年享完,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片有额。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡般又,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巍佑,到底是詐尸還是另有隱情茴迁,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布萤衰,位于F島的核電站笋熬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腻菇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一昔馋、第九天 我趴在偏房一處隱蔽的房頂上張望筹吐。 院中可真熱鬧,春花似錦秘遏、人聲如沸丘薛。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洋侨。三九已至,卻和暖如春倦蚪,著一層夾襖步出監(jiān)牢的瞬間希坚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工陵且, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裁僧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓慕购,卻偏偏與公主長(zhǎng)得像聊疲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沪悲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 概覽 大家都知道获洲,在開(kāi)發(fā)過(guò)程中應(yīng)該盡可能減少用戶等待時(shí)間,讓程序盡可能快的完成運(yùn)算殿如」鄙海可是無(wú)論是哪種語(yǔ)言開(kāi)發(fā)的程序最...
    CocoLeo閱讀 858評(píng)論 1 9
  • 一、多線程簡(jiǎn)介: 所謂多線程是指一個(gè) 進(jìn)程 -- process(可以理解為系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序)中可以開(kāi)...
    尋形覓影閱讀 1,017評(píng)論 0 6
  • 1固歪、簡(jiǎn)介:1.1 iOS有三種多線程編程的技術(shù)蒜鸡,分別是:1.、NSThread2牢裳、Cocoa NSOperatio...
    LuckTime閱讀 1,339評(píng)論 0 1
  • 什么是線程逢防?什么是進(jìn)程?線程和進(jìn)程什么關(guān)系蒲讯?這不是我們這一章關(guān)心的重點(diǎn)忘朝,我在這里假設(shè)大家都知道線程是cpu調(diào)度的最...
    隨風(fēng)流逝閱讀 358評(píng)論 0 1
  • 由于筆者之前半年的時(shí)間主要做bug定位修復(fù),以及數(shù)據(jù)加密代碼混淆一類的安全類工作.有相當(dāng)長(zhǎng)一段時(shí)間沒(méi)有用table...
    Abler閱讀 620評(píng)論 0 3