iOS開發-多線程的一些基礎知識

vvvvlxw 8年前發布 | 6K 次閱讀 多線程 iOS開發 移動開發

多線程

首先介紹一下進程和線程

進程

  • 進程代表當前運行的一個程序(是系統分配資源的基本單位,可以理解為一個工廠)

iOS開發-多線程的一些基礎知識

Paste_Image.psng

線程

  • 線程是cpu調度的最小單位,一個進程含有一個線程或多個線程(應用程序打開后會默認開辟一個線程,叫做主線程或者UI線程,線程可以理解為工人里的一個工人

多線程的原理

  • 同一時間,CPU只能處理1條線程,只有1條線程在工作(執行)

  • 多線程并發(同時)執行,其實是CPU快速地在多條線程之間調度(切換)

  • 如果CPU調度線程的時間足夠快,就造成了多線程并發執行的

  • 創建的線程不易過多:
    CPU會在N多線程之間調度,CPU會累死,消耗大量的CPU資源
    每條線程被調度執行的頻次會降低(線程的執行效率降低)

多線程的缺點

  • 創建線程是有開銷的,iOS下主要成本包括:內核數據結構(大約1KB)、棧空間(子線程512KB、主線程1MB,也可以使用-setStackSize:設置,但必須是4K的倍數,而且最小是16K),創建線程大約需要90毫秒的創建時間

  • 如果開啟大量的線程,會降低程序的性能

  • 線程越多,CPU在調度線程上的開銷就越大

  • 程序設計更加復雜:比如線程之間的通信、多線程的數據共享

主線程

  • 什么是主線程

    一個iOS程序運行后,默認會開啟1條線程,稱為“主線程”或“UI線程”

  • 主線程的主要作用

    顯示\刷新UI界面

    處理UI事件(比如點擊事件、滾動事件、拖拽事件等)

  • 主線程的使用注意

    別將比較耗時的操作放到主線程中

    耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的壞體驗

串行-并行-并發區別

  • 串行:多個任務按順序執行,類似于一個窗口辦公排隊

執行順序 下載文件A->下載文件B->下載文件C,也可以認為線程是進程中的一條文件路徑

  • 并行:多個任務同一時間一起執行,類似于多個窗口辦公

  • 并發:多個任務看似是同一時間一起執行,但實際上是CPU快速的輪轉切換造成的假象

  • ps:我們使用多線程其實就是并發編程

    使用多線程的優點:

  • 可以減少多個任務執行所需要的總時長,提升cpu利用率

    使用多線程的缺點:

  • 1.線程需要耗費系統資源 ,主線程要消耗棧空間的1MB資源,其他線程每個消耗512KB資源,不要過多使用

    • 2.線程使用過多會使程序變得復雜,容易出現問題,不容易調試維護

    </li> </ul>

    耗時操作建議放到子線程中(后臺線程,非子線程)

    多線程實現方案

    打印當前線程

    NSLog(@"當前線程 : %@",[NSThread currentThread]);

    打印主線程

    NSLog(@"主線程 : %@",[NSThread mainThread]);

    判斷線程是否是主線程

    BOOL isMainThread = [NSThread isMainThread];

    休眠

    [NSThread sleepForTimeInterval:3.0];

    創建一個線程

    NSThread *thread  = [[NSThread alloc] initWithTarget:self selector:@selector(threadAction) object:nil];

    //設置線程名
    thread.name = @"sq線程";

    //設置線程優先級(The thread’s priority, which is specified by a floating point number from 0.0 to 1.0, where 1.0 is highest priority.) thread.threadPriority = 1.0f;

    //需要手動開啟線程 [thread start];</code></pre>

    通過類方法創建一個線程(不推薦,設置不了相關屬性(如姓名等)

    [NSThread detachNewThreadSelector:@selector(threadAction) toTarget:self withObject:nil];

    在后臺執行一個方法(耗時操作)

    [self performSelectorInBackground:@selector(backgroundAction) withObject:nil];

    在前臺執行一個方法(如UI刷新操作需要在主線程中進行)

    [self performSelectorOnMainThread:@selector(mainAction) withObject:nil waitUntilDone:YES];

     //參數1:需要在主線程中執行的方法
    //參數2:傳值
    //參數3:是否阻塞線程(等待執行完成后繼續執行后面代碼)</code></pre> 
    

    A 線程鎖(比較耗資源,不建議用)

    • 在線程鎖中只有一個線程執行完之后其他線程才能進入

      //通常用self作標簽 
      @synchronized (self) {}

     

    來自:http://www.jianshu.com/p/f354872cd5b5

     

 本文由用戶 vvvvlxw 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!