iOS多線程

進程: 系統(tǒng)正在運行的一個應用程序,每個進程之間是獨立的,互不干擾.

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

線程

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

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

多線程:

多線程原理:

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

多線程優(yōu)點:

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

多線程缺點:

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

iOS 中多線程的注意點

主線程:一個iOS 程序運行后,默認會開啟一條線程,稱為主線程.

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

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

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

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

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

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

//NSThread 對象就代表一條線程
    //方式1 : 需要手動開啟線程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    //開啟線程
    [thread start];
    
    //方式2: 線程自動開啟,不用手動開啟
    [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語言實現(xiàn). 簡單易用,可以直接操作線程對象. 需要程序員管理線程生命周期.
  • GCD: C語言實現(xiàn). 旨在替代NSThread 等線程技術. 系統(tǒng)自動管理線程生命周期.
  • NSOperation: OC語言實現(xiàn). 基于GCD,比GCD多了一些簡單實用的功能. 系統(tǒng)自動管理線程生命周期.
  1. NSThread 實現(xiàn)多線程

一個NSThread 的對象,就代表一條線程

常見方法

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

線程安全

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

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

格式: @synchronized () { }

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

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

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

  • 原子屬性和非原子屬性

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

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

nonatomic: 非原子屬性,不會加鎖

注意: iOS中推薦使用nonatomic,因為atomic加鎖會消耗資源,適合內(nèi)存小的移動設備

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末询兴,一起剝皮案震驚了整個濱河市攀操,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌从隆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岁疼,死亡現(xiàn)場離奇詭異俐载,居然都是意外死亡,警方通過查閱死者的電腦和手機缎岗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白粉,“玉大人传泊,你說我怎么就攤上這事⊙及停” “怎么了眷细?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹃祖。 經(jīng)常有香客問我溪椎,道長,這世上最難降的妖魔是什么恬口? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任校读,我火速辦了婚禮,結果婚禮上祖能,老公的妹妹穿的比我還像新娘歉秫。我一直安慰自己,他們只是感情好养铸,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布雁芙。 她就那樣靜靜地躺著轧膘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兔甘。 梳的紋絲不亂的頭發(fā)上谎碍,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音洞焙,去河邊找鬼椿浓。 笑死,一個胖子當著我的面吹牛闽晦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播提岔,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼仙蛉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碱蒙?” 一聲冷哼從身側響起荠瘪,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赛惩,沒想到半個月后哀墓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡喷兼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年篮绰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片季惯。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吠各,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勉抓,到底是詐尸還是另有隱情贾漏,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布藕筋,位于F島的核電站纵散,受9級特大地震影響,放射性物質發(fā)生泄漏隐圾。R本人自食惡果不足惜伍掀,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暇藏。 院中可真熱鬧硕盹,春花似錦、人聲如沸叨咖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至垛贤,卻和暖如春焰坪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聘惦。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工某饰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人善绎。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓黔漂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親禀酱。 傳聞我的和親對象是個殘疾皇子炬守,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 多線程 在iOS開發(fā)中為提高程序的運行效率會將比較耗時的操作放在子線程中執(zhí)行,iOS系統(tǒng)進程默認啟動一個主線程剂跟,用...
    郭豪豪閱讀 2,590評論 0 4
  • 多線程基本概念 單核CPU减途,同一時間cpu只能處理1個線程,只有1個線程在執(zhí)行 。多線程同時執(zhí)行:是CPU快速的在...
    WeiHing閱讀 702評論 1 5
  • .一.進程 進程:是指在系統(tǒng)中正在運行的一個應用程序,每個進程之間是獨立的曹洽,每個進程均運行在其專用且受保護的內(nèi)存空...
    IIronMan閱讀 4,479評論 1 33
  • 又來到了一個老生常談的問題鳍置,應用層軟件開發(fā)的程序員要不要了解和深入學習操作系統(tǒng)呢? 今天就這個問題開始送淆,來談談操...
    tangsl閱讀 4,098評論 0 23
  • 感恩日記(2018/01/01總437) 感恩:早睡早起第168天税产。22:30睡覺,5:50起床偷崩。貴在堅持砖第,我會繼...
    喜羊羊_43e1閱讀 249評論 2 5