iOS多線程

進(jìn)程: 系統(tǒng)正在運(yùn)行的一個(gè)應(yīng)用程序,每個(gè)進(jìn)程之間是獨(dú)立的,互不干擾.

線程: 一個(gè)應(yīng)用程序想要執(zhí)行任務(wù),必須得有線程,么個(gè)進(jìn)程至少要有一條線程. 線程是進(jìn)程的基本執(zhí)行單元.(在進(jìn)程中開辟線程,所有任務(wù)都是在線程中執(zhí)行)

線程

一個(gè)線程中任務(wù)的執(zhí)行是串行的,如果要在一個(gè)線程中執(zhí)行多個(gè)任務(wù),那么只能一個(gè)一個(gè)地按順序執(zhí)行這些任務(wù).

多線程: 一個(gè)進(jìn)程中可以開啟多條線程,每條線程可以并行執(zhí)行不同的任務(wù).

多線程:

多線程原理:

  • 同一時(shí)間,CPU 只能處理一條線程,只有一條線程在工作
  • 多線程并發(fā)執(zhí)行,其實(shí)是CPU 快速地在多條線程之間切換
  • 如果CPU 調(diào)度線程的之間足夠快,救造成了多線程并發(fā)執(zhí)行的假象

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

  • 提高程序的執(zhí)行效率
  • 能適當(dāng)提高資源利用率

多線程缺點(diǎn):

  • 開啟線程需要占用一定的內(nèi)存空間 (默認(rèn)情況下,主線程占用512KB ,子線程占用512KB), 開啟大量線程,占用大量內(nèi)存空間,降低程序的性能.
  • 線程越多,CPU 開銷越大
  • 程序設(shè)計(jì)復(fù)雜,線程之間的通信,多線程的數(shù)據(jù)共享

iOS 中多線程的注意點(diǎn)

主線程:一個(gè)iOS 程序運(yùn)行后,默認(rèn)會(huì)開啟一條線程,稱為主線程.

* 顯示/刷新UI 界面
* 處理UI 事件 (點(diǎn)擊事件,滾動(dòng)事件,拖拽事件)
* 不要將耗時(shí)的操作放到主線程中,會(huì)卡住主線程
* 不要同時(shí)開太多的線程 (1~3條即可,iOS中最多開5條線程)

子線程: 后臺線程,異步線程

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

  1. pthread: C語言實(shí)現(xiàn),跨平臺,可移植,適用于Linux/Unix/windows系統(tǒng).需要程序員管理線程生命周期.

創(chuàng)建pthread 線程,需要導(dǎo)入頭文件phtread.h

    //創(chuàng)建線程
    pthread_t myRestrict;
    /**
     *  參數(shù)1: 線程地址
        參數(shù)3: 線程中需要執(zhí)行的函數(shù)地址
     */
    pthread_create(&myRestrict, NULL, run, NULL);

//NSThread 對象就代表一條線程
    //方式1 : 需要手動(dòng)開啟線程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    //開啟線程
    [thread start];
    
    //方式2: 線程自動(dòng)開啟,不用手動(dòng)開啟
    [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:@"http://c.gif"];
    
    //方式3: 隱式創(chuàng)建線程
    [self performSelector:@selector(download:) withObject:@"http://c.gif"];
    
    //后臺子線程
    [self performSelectorInBackground:@selector(download:) withObject:@"http://a.gif"];
    //主線程
//    [self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>];
    //任意線程
//    [self performSelector:<#(nonnull SEL)#> onThread:<#(nonnull NSThread *)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>];


  • NSThread : OC語言實(shí)現(xiàn). 簡單易用,可以直接操作線程對象. 需要程序員管理線程生命周期.
  • GCD: C語言實(shí)現(xiàn). 旨在替代NSThread 等線程技術(shù). 系統(tǒng)自動(dòng)管理線程生命周期.
  • NSOperation: OC語言實(shí)現(xiàn). 基于GCD,比GCD多了一些簡單實(shí)用的功能. 系統(tǒng)自動(dòng)管理線程生命周期.
  1. NSThread 實(shí)現(xiàn)多線程

一個(gè)NSThread 的對象,就代表一條線程

常見方法

//獲取當(dāng)前線程
NSThread *current = [NSThread currentThread];
//獲取主線程
NSThread *main = [NSThread mainThread];
//判斷是否主線程
[NSThread isMainThread];
//線程睡眠
[NSThread sleepForTimeInterval:5]; //從本行代碼開始,線程休眠5秒
[NSThread sleepUntilDate:(NSDate *)date];
NSThread 的實(shí)例有一個(gè)name屬性,可以獲取當(dāng)前想成的名字
[NSThread exit]; //銷毀當(dāng)前線程

線程安全

為了方式多個(gè)線程搶奪同一個(gè)資源造成的數(shù)據(jù)安全問題

  • 線程鎖--互斥鎖,多條線程搶奪同一塊資源的時(shí)候需要加鎖

格式: @synchronized () { }

優(yōu)點(diǎn): 防止因多線程搶奪資源造成的數(shù)據(jù)安全問題

確定: 需要消耗大量的CPU資源

線程同步: 多條線程在同一條線上執(zhí)行 (按書序的執(zhí)行任務(wù))

  • 原子屬性和非原子屬性

OC在定義屬性是有nonatomic 和 atomic兩種選擇

atomic: 原子屬性,為setter方法加鎖(默認(rèn)就是atomic),自動(dòng)為該屬性加鎖,同一時(shí)間,只允許一條線程訪問該屬性

nonatomic: 非原子屬性,不會(huì)加鎖

注意: iOS中推薦使用nonatomic,因?yàn)閍tomic加鎖會(huì)消耗資源,適合內(nèi)存小的移動(dòng)設(shè)備

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

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

  • 多線程 在iOS開發(fā)中為提高程序的運(yùn)行效率會(huì)將比較耗時(shí)的操作放在子線程中執(zhí)行,iOS系統(tǒng)進(jìn)程默認(rèn)啟動(dòng)一個(gè)主線程,用...
    郭豪豪閱讀 2,720評論 0 4
  • 多線程基本概念 單核CPU,同一時(shí)間cpu只能處理1個(gè)線程,只有1個(gè)線程在執(zhí)行 。多線程同時(shí)執(zhí)行:是CPU快速的在...
    WeiHing閱讀 786評論 1 5
  • .一.進(jìn)程 進(jìn)程:是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序,每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空...
    IIronMan閱讀 4,604評論 1 33
  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,322評論 0 23
  • 感恩日記(2018/01/01總437) 感恩:早睡早起第168天。22:30睡覺,5:50起床。貴在堅(jiān)持,我會(huì)繼...
    喜羊羊_43e1閱讀 290評論 2 5

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