iOS多線程(一)多線程的概念及NSThread的使用

一、概念:

  • 進程:

  • 系統中正在運行的一個應用程序;

  • 每個進程之間是獨立的,每個進程均運行在其專用且受保護的內存空間內。

  • 線程:

  • 1個進程要想執行任務,必須得有線程(每1個進程至少要有1條線程);

  • 1個進程(進程)的所有任務都在線程中執行。

  • 線程的串行

  • 1個線程中,任務的執行是串行的。線程是進程中的1條執行路徑。

  • 多線程:

  • 1個進程可以開啟多條線程,每條線程可以并行(同時)執行不同的任務。

  • 多線程的原理:

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

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

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

  • 如果線程非常非常多:

    • CPU會在N多線程之間調度,CPU會累死,消耗大量的CPU資源;
    • 每條線程被調度執行的頻次會降低(線程的執行效率降低)。
  • 多線程的優缺點:

  • 多線程的優點:

    • 能適當提高程序的執行效率;
    • 能適當提高資源利用率(CPU、內存)。
  • 多線程的缺點:

    • 創建線程是有開銷的,iOS下主要成本包括:內核數據結構(大約1KB)、棧空間(子線程512KB、主線程1MB,也可以使用 -setStackSize: 設置,但必須是4K 的倍數,而且最小是16K),創建線程大約需要90毫秒的創建時間;
    • 如果開啟大量的線程,會降低程序的性能;
    • 線程越多,CPU在調度線程上的開銷就越大;
    • 程序設計更加復雜:比如線程之間的通信、多線程的數據共享。

二、應用:

  • pthread:了解,很少使用,純C語言;
  • NSThread:掌握
    • 創建線程的三種方式:

      方式一:

NSThread *thread = [NSThread alloc] initWithTarget: selector: object:];
[thread start];

  方式二:
````objc
[NSThread detachNewThreadSelector: toTarget: withObject:];
方式三:
[self performSelectorInBackground: withObject:];

后兩種方式優點是:簡單快捷;缺點:無法對線程進行更詳細的設置。

  • GCD:使用最多;
  • NSOperation:使用第二多。

三、多線程安全隱患解決 - 互斥鎖(線程同步)

  • 使用格式:
@synchronized(所對象){//需要鎖定的代碼}
  • 注意:鎖定1份代碼只用1把鎖,使用多把鎖是無效的

  • 使用互斥鎖的優缺點:

    • 優點:能有效防止因多線程搶奪資源造成的數據安全問題;
    • 缺點:需要消耗大量的CPU資源。
  • 互斥鎖的使用前提:多條線程搶奪同一塊資源。

  • 原子和非原子屬性:

  • OC在定義屬性時有 nonatomic 和 atomic 兩種選擇:

    • atomic:原子屬性,為setter方法加鎖(默認就是atomic);
    • nonatomic:非原子屬性,不會為setter方法加鎖。

四、線程間通信:

  • 去子線程的方法:
[self performSelectorInBackground: withObject:];
  • 回主線程常用方法:
[self performSelectorOnMainThread: withObject: waitUntilDone:];    //其中 self 可以換成具體對象
//也可以在拿到對象之后調用方法
[image performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject: waitUntilDone:];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容