多線程基礎01 概念和NSThread

閱讀原文-關注我的博客


在軟件開發中必不可少的會接觸到一個詞語--多線程;
那么什么是多線呢,本文主要是對多線程的基礎知識做簡單講解。


1 基本概念

1.1 進程的概念

  • 進程是指在系統正在運行的一個應用程序,每個進程是相對獨立

    eg: 當我們啟動QQ,那么就會開啟一個進程

1.2 線程的概念

  • 每個進程中至少要有一條線程。(一個程序的所有任務都是在線程中執行的)
  • 一個線程中任務的執行是串行的

1.3 多線程的概念

  • 一個進程中可以開多條線程,每條線程可以并行(同時)執行
    • 主線程 : 自動創建的,默認的 又叫UI線程
    • 子線程 : 又叫后臺線程
多線程原理
  • CPU同一時間只能有一條線程在工作,其實是CPU快速的在多條線程之間調度(切換);調度頻率快,就形成了多線程同時執行的“假象”。所以移動端不建議開太多線程一般在5條以內
多線程優缺點
  • 優點:能適當提高執行效率、資源(CPU,內存)利用率
  • 缺點:開啟線程占用內存,開銷大,性能降低
多線程在iOS開發中的應用
  • 默認有一條主線程(UI線程)有且只有一條。作用:負責顯示和刷新界面,處理UI事件

    注意:不要把耗時操作放在主線程中

2 iOS中多線程的實現方案

3 pthread的例子

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 創建一個線程標識符
        pthread_t myrestrict;
        
        // 1param 線程標識符變量的地址, 2param 寫NULL 3param 執行的的函數 4param NULL
        pthread_create(&myrestrict, NULL, run, NULL);
    }
    
    // 定義線程的函數
    void *run(void *data) {
        
        NSLog(@"%@", [NSThread currentThread]);
        
        return nil;
    }

4 NSThread的基本用法

創建方式1 創建后需啟動

//創建線程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download) object:nil];
        
// 啟動線程
[thread start];

創建方式2 創建后自動啟動

// 創建后直接啟動  傳一個字符串
[NSThread detachNewThreadSelector:@selector(download2:) toTarget:self withObject:@"param"];

創建方式3 隱式啟動

// 開啟子線程
[self performSelectorInBackground:@selector(download) withObject:nil];
        
// 開啟主線程
[self performSelector:@selector(download) withObject:nil];

// 開啟傳入的線程
[self performSelector:@selector(download) onThread:[NSThread currentThread] withObject:nil waitUntilDone:NO];

其它常用方法

// 獲取當前線程
NSThread *current = [NSThread currentThread];
// 獲取主線程
NSThread *main = [NSThread mainThread];
// 判斷是否主線程-類方法
BOOL isMain = [NSThread isMainThread];
// 判斷是否主線程-對象方法
BOOL isMain2 = [main isMainThread];
// 給線程起名字
current.name = @"下載線程";
// 線程睡眠狀態5秒
[NSThread sleepForTimeInterval:5.0];
// 線程睡眠從現在開始3秒以后的時間
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
// 線程退出 線程進入死亡狀態
[NSThread exit];

線程之間的通信

[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];
    
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
  • waitUntilDone: 是否等待執行完 performSelector:執行的方法 withObject: 傳參數

5.線程安全

  • 線程安全
    • 概念 : 多個線程奪取同一個資源,訪問一個變量
    • 解決方案 : 加鎖--線程鎖, 互斥鎖
    • 互斥鎖的格式 :
@synchronized(self) { 
    // 插入鎖定代碼 
  }
* >注意 : 一份代碼只能用一個鎖, 多個鎖無效
  • 線程鎖優缺點

    • 優點 : 能夠有效防止因多線程搶奪資源造成的數據安全問題
    • 缺點 : 消耗大量CPU資源
  • 線程同步

    • 多條線程在同一條線上執行(按順序執行)
    • 互斥鎖就運用了線程同步
  • 原子屬性和非原子屬性

    • atomic 會自動為setter方法加鎖
    • nonatomic 不會為setter方法 推薦使用這個

6.多線程狀態示意圖

在了解完線程安全后咱們再看看完整的線程狀態示意圖
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • 又來到了一個老生常談的問題,應用層軟件開發的程序員要不要了解和深入學習操作系統呢? 今天就這個問題開始,來談談操...
    tangsl閱讀 4,158評論 0 23
  • Object C中創建線程的方法是什么?如果在主線程中執行代碼,方法是什么?如果想延時執行代碼、方法又是什么? 1...
    AlanGe閱讀 1,777評論 0 17
  • 一、多線程基礎 基本概念 進程進程是指在系統中正在運行的一個應用程序每個進程之間是獨立的,每個進程均運行在其專用且...
    AlanGe閱讀 557評論 0 0
  • 蘭州。正寧路夜市。人很多。 很多城市都有一條游客如織的所謂美食街,東西不一定有多好吃,但人一定很多。 這條美食街,...
    王老虎尋鮮記閱讀 1,263評論 0 0
  • 一蹙憂眉 已在風中隱現 那彎彎的心思 在擺渡過往 過濾出了憂傷 也把我深深 隱藏 我只是,悄悄愛你 沒有目的, 毫...
    六月孺子牛閱讀 562評論 10 12