ios 多線程你需要了解的

了解多線程之前首先要了解一下幾個(gè)概念

進(jìn)程

進(jìn)程是指在系統(tǒng)中正在進(jìn)行的一個(gè)應(yīng)用程序;每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi)。

線程

一個(gè)進(jìn)程要想執(zhí)行任務(wù),必須得有線程(每一個(gè)進(jìn)程至少要有一條線程)笋粟,是進(jìn)程中執(zhí)行運(yùn)算的最小單位,是進(jìn)程中的一個(gè)實(shí)體析蝴,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位;

多線程

進(jìn)程中可以開啟多條線程害捕,每條線程可以并行(同時(shí))執(zhí)行不同的任務(wù)。多線程技術(shù)可以提高程序的執(zhí)行效率闷畸。

多線程原理

單核CPU同一時(shí)間內(nèi)能處理1條線程尝盼,多線程并發(fā)執(zhí)行,其實(shí)是CPU快速地在多條線程之間調(diào)度佑菩。如果CPU調(diào)度線程的時(shí)間足夠快盾沫,就造成了多線程并發(fā)執(zhí)行的假象。

多線程的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):能適當(dāng)提高程序的執(zhí)行效率殿漠;能適當(dāng)提高資源利用率(CPU赴精、內(nèi)存利用率)。
缺點(diǎn):開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下绞幌,主線程占用1M蕾哟,子線程占用512KB),如果開啟大量的線程莲蜘,會(huì)占用大量的內(nèi)存空間谭确,降低程序的性能;線程越多票渠,CPU在調(diào)度線程上的開銷就越大逐哈;程序設(shè)計(jì)更加復(fù)雜,例如線程之間的通信问顷、多線程的數(shù)據(jù)共享鞠眉。

同步和異步的區(qū)別

同步:只能在當(dāng)前線程中執(zhí)行任務(wù)薯鼠,不具備開啟新線程的能力
異步:可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力

并發(fā)和串行

并發(fā):多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行
串行:一個(gè)任務(wù)執(zhí)行完畢后械蹋,再執(zhí)行下一個(gè)任務(wù)

線程間怎么通信

NSThread

[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];

- (void)updateUI {
    // UI更新代碼
    self.alert.text = @"Thanks!";
}

NSOperationQueue

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    // UI更新代碼
    self.alert.text = @"Thanks!";
    }];

GCD

dispatch_async(dispatch_get_main_queue(), ^{
   // UI更新代碼
   self.alert.text = @"Thanks!";
});
多線程在ios中的運(yùn)用
1499394732413995.png
NSThread的使用

NSThread創(chuàng)建線程
/** 方法一,需要start */

NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething1:) object:@"NSThread1"];
// 線程加入線程池等待CPU調(diào)度羞芍,時(shí)間很快哗戈,幾乎是立刻執(zhí)行
[thread1 start];

- (void)doSomething1:(NSObject *)object {
    // 傳遞過來的參數(shù)
    NSLog(@"%@",object);
    NSLog(@"doSomething1:%@",[NSThread currentThread]);
}

/** 方法二,創(chuàng)建好之后自動(dòng)啟動(dòng) */

[NSThread detachNewThreadSelector:@selector(doSomething2:) toTarget:self withObject:@"NSThread2"];

- (void)doSomething2:(NSObject *)object {
    NSLog(@"%@",object);
    NSLog(@"doSomething2:%@",[NSThread currentThread]);
}

/** 方法三荷科,隱式創(chuàng)建唯咬,直接啟動(dòng) */

[self performSelectorInBackground:@selector(doSomething3:) withObject:@"NSThread3"];

- (void)doSomething3:(NSObject *)object {
    NSLog(@"%@",object);
    NSLog(@"doSomething3:%@",[NSThread currentThread]);
}

返回當(dāng)前線程

// 當(dāng)前線程
[NSThread currentThread];
NSLog(@"%@",[NSThread currentThread]);

阻塞休眠

//休眠多久
[NSThread sleepForTimeInterval:2];
//休眠到指定時(shí)間
[NSThread sleepUntilDate:[NSDate date]];

其他一些方法

//退出線程
[NSThread exit];
//判斷當(dāng)前線程是否為主線程
[NSThread isMainThread];
//判斷當(dāng)前線程是否是多線程
[NSThread isMultiThreaded];
//主線程的對(duì)象
NSThread *mainThread = [NSThread mainThread];
GCD的理解與使用

GCD中有2個(gè)核心概念
(1)任務(wù):執(zhí)行什么操作
(2)隊(duì)列:用來存放任務(wù)

隊(duì)列

不管是什么隊(duì)列,一定是FIFO隊(duì)列畏浆,即先進(jìn)先出胆胰。
所以,請(qǐng)大家記住了:不管是串行隊(duì)列(SerialQueue)還是并發(fā)隊(duì)列(ConcurrencyQueue)刻获,都是FIFO隊(duì)列蜀涨。也就意味著,任務(wù)一定是一個(gè)一個(gè)地蝎毡,按照先進(jìn)先出的順序來執(zhí)行厚柳。

串行隊(duì)列:
在創(chuàng)建隊(duì)列時(shí),傳參數(shù)DISPATCH_QUEUE_SERIAL表示創(chuàng)建串行隊(duì)列沐兵。任務(wù)會(huì)一個(gè)一個(gè)地執(zhí)行别垮,只有前一個(gè)任務(wù)執(zhí)行完成,才會(huì)繼續(xù)執(zhí)行下一個(gè)任務(wù)扎谎。串行執(zhí)行并不是同步執(zhí)行的意思碳想,一定要注意區(qū)分。

并發(fā)隊(duì)列:
在創(chuàng)建隊(duì)列時(shí)毁靶,傳參數(shù)DISPATCH_QUEUE_CONCURRENT表示創(chuàng)建并發(fā)隊(duì)列胧奔。并發(fā)隊(duì)列會(huì)盡可能多地創(chuàng)建線程去執(zhí)行任務(wù)。并發(fā)隊(duì)列中的任務(wù)會(huì)按入隊(duì)的順序執(zhí)行任務(wù)老充,但是哪個(gè)任務(wù)先完成是不確定的葡盗。

串行隊(duì)列

dispatch_queue_t serialQueue = dispatch_queue_create("serial_queue", 
DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
  NSLog(@"s1");
 });
dispatch_async(serialQueue, ^{
  sleep(2);
  NSLog(@"s2");
});
dispatch_async(serialQueue, ^{
sleep(1);
NSLog(@"s3");
});

打印 s1,s2,s3

并發(fā)隊(duì)列

dispatch_queue_t concurrencyQueue = dispatch_queue_create("com.huangyibiao.concurrency-queue",
                                                              DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(concurrencyQueue, ^{
        NSLog(@"s1");
    });
    dispatch_async(concurrencyQueue, ^{
        sleep(2);
        NSLog(@"s2");
    });
    dispatch_async(concurrencyQueue, ^{
        sleep(1);
        NSLog(@"s3");
    });

打印 s1,s3,s2

同步異步線程

// 全局并發(fā)隊(duì)列的獲取方法
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 同步執(zhí)行任務(wù)創(chuàng)建方法
dispatch_sync(queue, ^{
    // 這里放同步執(zhí)行任務(wù)代碼
});
// 異步執(zhí)行任務(wù)創(chuàng)建方法
dispatch_async(queue, ^{
    // 這里放異步執(zhí)行任務(wù)代碼
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啡浊,隨后出現(xiàn)的幾起案子觅够,更是在濱河造成了極大的恐慌,老刑警劉巖巷嚣,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喘先,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡廷粒,警方通過查閱死者的電腦和手機(jī)窘拯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門红且,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涤姊,你說我怎么就攤上這事暇番。” “怎么了思喊?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵壁酬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我恨课,道長(zhǎng)舆乔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任剂公,我火速辦了婚禮希俩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纲辽。我一直安慰自己颜武,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布文兑。 她就那樣靜靜地躺著盒刚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绿贞。 梳的紋絲不亂的頭發(fā)上因块,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音籍铁,去河邊找鬼涡上。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拒名,可吹牛的內(nèi)容都是我干的吩愧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼增显,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼雁佳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起同云,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤糖权,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后炸站,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體星澳,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年旱易,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了禁偎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腿堤。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖如暖,靈堂內(nèi)的尸體忽然破棺而出笆檀,到底是詐尸還是另有隱情,我是刑警寧澤盒至,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布误债,位于F島的核電站,受9級(jí)特大地震影響妄迁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜李命,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一登淘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧封字,春花似錦黔州、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笆制,卻和暖如春绅这,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背在辆。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工证薇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匆篓。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓浑度,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鸦概。 傳聞我的和親對(duì)象是個(gè)殘疾皇子箩张,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,393評(píng)論 8 265
  • iOS多線程編程 基本知識(shí) 1. 進(jìn)程(process) 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序,就是一段程序的執(zhí)...
    陵無山閱讀 6,055評(píng)論 1 14
  • 又來到了一個(gè)老生常談的問題窗市,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢先慷? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,129評(píng)論 0 23
  • Object C中創(chuàng)建線程的方法是什么谨设?如果在主線程中執(zhí)行代碼熟掂,方法是什么?如果想延時(shí)執(zhí)行代碼扎拣、方法又是什么赴肚? 1...
    AlanGe閱讀 1,740評(píng)論 0 17
  • 【作者】楊雨琛 【導(dǎo)師】王玉印 【分舵】獨(dú)孤求敗 【舵主】楊雨琛 【導(dǎo)圖解說】 賊喜歡的一個(gè)角色素跺,想了很久終于動(dòng)筆
    楊雨琛閱讀 622評(píng)論 2 2