iOS篇-線程篇-0基礎(chǔ)到熟練應(yīng)用多線程( 一 )

一 : 科普一分鐘

  • 為了讓我們的應(yīng)用程序更加絲滑,蘋果為我們提供了多套多線程API,來幫助我們處理耗時(shí),冗余的事情,我們要正確,并且適當(dāng)?shù)膽?yīng)用它.

  • 多線程是我們開發(fā)中的重點(diǎn),巧妙的利用它,會(huì)讓我們的開發(fā)更加的順利 流暢.

  • 多線程為重點(diǎn)我會(huì)分多期為大家講解討論,這篇為基礎(chǔ)篇,做簡(jiǎn)單的入門介紹.

二 : 多線程的基礎(chǔ)知識(shí)

1.進(jìn)程
  • 概念
    進(jìn)程是在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序,每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用,且受保護(hù)的內(nèi)存空間.
2.線程
  • 概念
    1個(gè)進(jìn)程想要執(zhí)行任務(wù),必須得有線程,每個(gè)進(jìn)程程至少要一個(gè)線程,一個(gè)進(jìn)程的所有任務(wù)都在線程中執(zhí)行
  • 線程的串行
    一個(gè)線程中任務(wù)的執(zhí)行時(shí)串行的,如果要在一個(gè)線程中執(zhí)行多個(gè)任務(wù),那么只能一個(gè)一個(gè)地按順序執(zhí)行這些任務(wù),每個(gè)線程就好比一個(gè)人,我們不能再吃飯的時(shí)候去睡覺,(當(dāng)然排除有些怪人)要一件一件的做事情.
    在同一時(shí)間內(nèi),一個(gè)線程只能執(zhí)行一個(gè)任務(wù).
3.進(jìn)程和線程的比較
  • 線程是CPU 執(zhí)行任務(wù)的最小單位
  • 進(jìn)程是CPU 分配資源和調(diào)度的單位
  • 一個(gè)線程可以對(duì)應(yīng)多個(gè)進(jìn)程,一個(gè)進(jìn)程中可以有多個(gè)線程,但至少有一個(gè)
  • 同一個(gè)進(jìn)程內(nèi)的線程共享進(jìn)程的資源
4.多線程的定義
  • 概念
    一個(gè)進(jìn)程中可以開啟多條線程,每個(gè)線程可以并行(同時(shí))執(zhí)行不同任務(wù)

  • 解析

多線程.png

單線程的時(shí)候 我們要做一個(gè)任務(wù)需要15秒的時(shí)間,現(xiàn)在我們拆分成三條線程A,B,C同時(shí)去做,時(shí)間就是 5秒.提高效率

5.多線程的原理
  • 同一時(shí)間 (單個(gè))CPU 只能處理一個(gè)線程,只有一條線程在工作
  • 多線程并發(fā)執(zhí)行,其實(shí)就是CPU 快速在多條線程之間切換
  • 如果CPU切換線程時(shí)間足夠快,就造成了多線程并發(fā)執(zhí)行的假象

如果線程切換太快CPU 會(huì)承受不住壓力死掉,消耗大量的CPU 資源
正常開啟3-5條線程 就可以了

6.多線程的優(yōu)點(diǎn)和缺點(diǎn)
  • 優(yōu)點(diǎn)
    1. 能適當(dāng)提高程序執(zhí)行效率
    2. 能適當(dāng)提高資源利用率
  • 缺點(diǎn)
  1. 創(chuàng)建線程是有開銷的,iOS下主要成本包括時(shí)間成本和空間成本:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(約1kb) 棧空間(子線程512KB ,主線程 1MB 也可以用setStacksize 設(shè)置,但必須是4K的倍數(shù),而且最小16KB) 創(chuàng)建線程大約需要90毫秒的創(chuàng)建時(shí)間

  2. 如果開啟大量的線程 會(huì)降低程序的性能.

  3. 線程數(shù)越多,CPU在調(diào)度線程上的開銷越大,因?yàn)檎{(diào)度的時(shí)候 記錄上一次任務(wù)開始和結(jié)束也需要時(shí)間

  4. 程序設(shè)計(jì)更加復(fù)雜,比如線程之間的通信,線程的數(shù)據(jù)共享.

三 : 多線程在開發(fā)中的應(yīng)用

  • 主線程
    程序運(yùn)行后,默認(rèn)會(huì)開啟一條線程,成為主線程或者UI線程.
    通常顯示和刷新UI 事件,處理點(diǎn)擊事件,滾動(dòng)事件,拖拽事件等等,凡是和UI 相關(guān)操作在中線程執(zhí)行.
  • 主線程使用注意
    1. 別將耗時(shí)操作放到主線程執(zhí)行
    2. 耗時(shí)操
      作會(huì)卡住主線程 嚴(yán)重影響UI 的流程度,給用戶不好體驗(yàn).
      耗時(shí)操作應(yīng)該放在子線程去執(zhí)行.
  • 獲取線程的幾種方式

1.獲取主線程

 NSThread *mainThread = [NSThread mainThread];
    NSLog(@"-mainThread-%@",mainThread);

2.獲得當(dāng)前線程

 NSThread *currentThread = [NSThread currentThread];
    NSLog(@"--currentThread-%@",currentThread);

3.判斷當(dāng)先線程是否為主線程
numberi = 1 為主線程

類方法

 BOOL ismainThread = [NSThread isMainThread];

對(duì)象方法

   //對(duì)象方法
   NSThread *currentThread = [NSThread currentThread];
    BOOL ismainThread1 = [currentThread isMainThread];
    
    NSLog(@"--%d---%d",ismainThread,ismainThread1);
  • 假如我們把一個(gè)耗時(shí)操作放在主線程 則UI將會(huì)被卡死,知道任務(wù)結(jié)束的時(shí)候才會(huì)響應(yīng),例如我們將一個(gè)循環(huán)放到 viewDidLoad方法里
//耗時(shí)操作
-(void)lastTimeAction{

    for (int i = 0; i < 100000; i++) {
        NSLog(@" i =  %d ---currentThread = %@",i,[NSThread mainThread]);
        
    }

}

循環(huán)打印 直到循環(huán)結(jié)束才能 繼續(xù)主線程UI 否則此時(shí)用戶操作是無響應(yīng)的,之前我們講解過,線程的串行性.

四 : iOS 多線程的實(shí)現(xiàn)方案

在開發(fā)中我們都用哪些方法去實(shí)現(xiàn)多線程呢,有以下四中方法

  • pthread
    這是一款多用API 適用于很多平臺(tái)比如 Unix/LinUX\Windows,具有跨平臺(tái)行和可移植性.
    語言為C語言 ,手動(dòng)管理生命周期,但是這個(gè)我們幾乎很少用.

  • NSThread
    這個(gè)是一款面向?qū)ο驛PI,簡(jiǎn)單易懂,可直接操作,語言是OC,手動(dòng)管理生命周期

  • GCD
    這個(gè)是蘋果提供替代NSThread等現(xiàn)場(chǎng)技術(shù),可以充分利用設(shè)備的多核API 語言為C語言 ,系統(tǒng)自動(dòng)管理生命周期

  • NSOPeration
    基于GCD,比GCD 多了一些更簡(jiǎn)單使用的功能,使用更加面向?qū)ο?語言為 OC ,系統(tǒng)自動(dòng)管理生命周期

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

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

  • 多線程 在iOS開發(fā)中為提高程序的運(yùn)行效率會(huì)將比較耗時(shí)的操作放在子線程中執(zhí)行,iOS系統(tǒng)進(jìn)程默認(rèn)啟動(dòng)一個(gè)主線程,用...
    郭豪豪閱讀 2,721評(píng)論 0 4
  • //:如有需要代碼demo 在評(píng)論留下郵箱 即刻回復(fù) 一 : 科普一分鐘 上一期簡(jiǎn)單普及了一下有多線程的知識(shí).如...
    TianTianBaby223閱讀 567評(píng)論 2 6
  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,322評(píng)論 0 23
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,048評(píng)論 25 709
  • 進(jìn)程的概念 進(jìn)程是操作系統(tǒng)上的概念,操作系統(tǒng)是直接驅(qū)動(dòng)、管理計(jì)算機(jī)硬件的一款管理軟件,它的運(yùn)行幫助我們利用計(jì)算機(jī)硬...
    伶俐ll閱讀 820評(píng)論 0 3

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