ios初級 (線程與隊列的關(guān)系,傻瓜學(xué)線程)

簡介

對于許多面試題 會經(jīng)常問一些比較簡單問題 問線程 進(jìn)程區(qū)別 或者線程與隊列的到底有什么關(guān)系. 線程 和進(jìn)程關(guān)系這里就不講了比較簡單

線程與隊列的關(guān)系和區(qū)分

屏幕快照 2016-03-07 下午7.42.31.png

如圖 一個程序只有一個主隊列, 并且主隊列是一個特殊的串行隊列
所以說主隊列是一個串行隊列
綠圖(飯?zhí)媚P? 并行隊列 就是多條線程一起 執(zhí)行任務(wù)沒有順序
如果把這個圖看成一個進(jìn)程的話 那么這個進(jìn)程里一共開了四條線程.(一個主線程 三個子線程).

如何開線程

在ios里面一共有三種方式 開辟線程 1.NSThread 2.GCD 3.NSOPeration
第一種很少人會用 他是oc開線程的方法 因為有許多缺點 所以很少人會用(缺點:手動管理線程, 無法利用多核技術(shù))
第二種 第三種 需要掌握 這里我們主要說說GCD 是如何開線程的
第三種NSOPeration 是對蘋果公司 對GCD 的一個封裝(掌握)

GCD 應(yīng)用廣泛

自動開線程 ,延遲操作,運用于單例的創(chuàng)建等.

GCD開線程

大家都聽過異步 和同步吧 其實異步和同步 就是用GCD 來寫的
大家記住一件事
dispatch_async(dispatch_get_main_queue(), ^{ });異步里參數(shù)除非是dispatch_get_main_queue() 這個主隊列 其余的包括 全局隊列(并行隊列) 和串行隊列放入這個異步 作為參數(shù)時 他們都會自動創(chuàng)建線程

那么在異步添加到 并行隊列(全局隊列)與串行隊列 都會自動開線程那么他們有什么區(qū)別嗎?

全局隊列是什么 他是一個系統(tǒng)自帶的并行隊列 所以大家以后不用創(chuàng)建并行隊列 直接用.
串行隊列 需要手動創(chuàng)建 程序里 已經(jīng)有了一個特殊的串行隊列dispatch_get_main_queue()(主隊列)主隊列比較特殊 異步加入主線程 這個異步不會開啟線程 . 會在主線程執(zhí)行
但是自定義創(chuàng)建的串行隊列 就不一樣了

/**
*  async -- 并發(fā)隊列(最常用)
*  會不會創(chuàng)建線程:會奇适,一般同時開多條
*  任務(wù)的執(zhí)行方式:并發(fā)執(zhí)行
*/
- (void)asyncGlobalQueue
{
  // 獲得全局的并發(fā)隊列
  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  
  // 將 任務(wù) 添加 全局隊列 中去 異步 執(zhí)行
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片1---%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片2---%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片3---%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片4---%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片5---%@", [NSThread currentThread]);
  });
}

/**
*  async -- 串行隊列(有時候用)
*  會不會創(chuàng)建線程:會,一般只開1條線程
*  任務(wù)的執(zhí)行方式:串行執(zhí)行(一個任務(wù)執(zhí)行完畢后再執(zhí)行下一個任務(wù))
*/
- (void)asyncSerialQueue
{
  // 1.創(chuàng)建一個串行隊列
  dispatch_queue_t queue = dispatch_queue_create("cn.heima.queue", NULL);
  
  // 2.將任務(wù)添加到串行隊列中 異步 執(zhí)行
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片1---%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片2---%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片3---%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片4---%@", [NSThread currentThread]);
  });
  dispatch_async(queue, ^{
      NSLog(@"-----下載圖片5---%@", [NSThread currentThread]);
  });

把這幾行代碼粘到你工程中 你就明白了(打印當(dāng)前線程) 如代碼注釋所示 異步加入串行隊列 無論你寫多少異步 加入者個串行隊列 他只會開一條線程.
而異步加入全局隊列 你有幾個異步那么他開幾個線程(最好不要超過5個).

線程的鎖死

簡單的鎖死 有些人 會在主線程中 執(zhí)行dispatch_sync(dispatch_get_main_queue(), ^{ });
這一行的代碼 這樣會造成鎖死

原因

寫了這句話他會加入主線程隊列里 等待主線程完成 才回返回block里面的內(nèi)容.但是當(dāng)程序運行到這行代碼 由于主線程沒有完成 block 不會有返回.并且也不會跳過這行代碼 所以就造成了死鎖現(xiàn)象.

主隊列和主線程的區(qū)別

代碼描述[NSOperationQueue mainQueue]主隊列 [NSThread mainThread]主線程

二者關(guān)系 主隊列里 必須有一個主線程 主隊列里可以在加線程

同步加入全局隊列要注意的是

dispatch_sync 在全局隊列是可以寫的 等主隊列執(zhí)行完了 它再執(zhí)行就是了 沒什么大不了

加在主隊列 含義是就是 加在主隊列執(zhí)行完后 了你才能執(zhí)行.(例如更新ui)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馁龟,隨后出現(xiàn)的幾起案子燎潮,更是在濱河造成了極大的恐慌惊奇,老刑警劉巖朦佩,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捺萌,死亡現(xiàn)場離奇詭異鹿寨,居然都是意外死亡新博,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門脚草,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赫悄,“玉大人,你說我怎么就攤上這事」』矗” “怎么了姑隅?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長倔撞。 經(jīng)常有香客問我讲仰,道長,這世上最難降的妖魔是什么误窖? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任叮盘,我火速辦了婚禮,結(jié)果婚禮上霹俺,老公的妹妹穿的比我還像新娘柔吼。我一直安慰自己,他們只是感情好丙唧,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布愈魏。 她就那樣靜靜地躺著,像睡著了一般想际。 火紅的嫁衣襯著肌膚如雪培漏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天胡本,我揣著相機(jī)與錄音牌柄,去河邊找鬼。 笑死侧甫,一個胖子當(dāng)著我的面吹牛珊佣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播披粟,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼咒锻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了守屉?” 一聲冷哼從身側(cè)響起惑艇,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拇泛,沒想到半個月后滨巴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡俺叭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年恭取,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绪颖。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡秽荤,死狀恐怖甜奄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窃款,我是刑警寧澤课兄,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站晨继,受9級特大地震影響烟阐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜紊扬,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一蜒茄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧餐屎,春花似錦檀葛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至藏鹊,卻和暖如春润讥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盘寡。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工楚殿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竿痰。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓脆粥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親菇曲。 傳聞我的和親對象是個殘疾皇子冠绢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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