iOS開發(fā)多線程篇—多線程簡(jiǎn)單介紹

原文:http://www.cnblogs.com/wendingding/p/3805088.html

一、進(jìn)程和線程
1.什么是進(jìn)程

進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序
每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi)


比如同時(shí)打開QQ、Xcode,系統(tǒng)就會(huì)分別啟動(dòng)2個(gè)進(jìn)程
通過“活動(dòng)監(jiān)視器”可以查看Mac系統(tǒng)中所開啟的進(jìn)程

2.什么是線程
1個(gè)進(jìn)程要想執(zhí)行任務(wù),必須得有線程(每1個(gè)進(jìn)程至少要有1條線程)
線程是進(jìn)程的基本執(zhí)行單元,一個(gè)進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行
比如使用酷狗播放音樂、使用迅雷下載電影,都需要在線程中執(zhí)行

  

3.線程的串行

1個(gè)線程中任務(wù)的執(zhí)行是串行的
如果要在1個(gè)線程中執(zhí)行多個(gè)任務(wù),那么只能一個(gè)一個(gè)地按順序執(zhí)行這些任務(wù)
也就是說,在同一時(shí)間內(nèi),1個(gè)線程只能執(zhí)行1個(gè)任務(wù)
比如在1個(gè)線程中下載3個(gè)文件(分別是文件A、文件B、文件C)


二、多線程

1.什么是多線程
1個(gè)進(jìn)程中可以開啟多條線程,每條線程可以并行(同時(shí))執(zhí)行不同的任務(wù)
進(jìn)程 ->車間,線程->車間工人
多線程技術(shù)可以提高程序的執(zhí)行效率
比如同時(shí)開啟3條線程分別下載3個(gè)文件(分別是文件A、文件B、文件C)



2.多線程的原理

同一時(shí)間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行)多線程并發(fā)(同時(shí))執(zhí)行,其實(shí)是CPU快速地在多條線程之間調(diào)度(切換)如果CPU調(diào)度線程的時(shí)間足夠快,就造成了多線程并發(fā)執(zhí)行的假象思考:如果線程非常非常多,會(huì)發(fā)生什么情況?CPU會(huì)在N多線程之間調(diào)度,CPU會(huì)累死,消耗大量的CPU資源每條線程被調(diào)度執(zhí)行的頻次會(huì)降低(線程的執(zhí)行效率降低)

3.多線程的優(yōu)缺點(diǎn)

多線程的優(yōu)點(diǎn)
能適當(dāng)提高程序的執(zhí)行效率
能適當(dāng)提高資源利用率(CPU、內(nèi)存利用率)

多線程的缺點(diǎn)
開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下,主線程占用1M,子線程占用512KB),如果開啟大量的線程,會(huì)占用大量的內(nèi)存空間,降低程序的性能
線程越多,CPU在調(diào)度線程上的開銷就越大
程序設(shè)計(jì)更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享

4.多線程在iOS開發(fā)中的應(yīng)用
主線程:一個(gè)iOS程序運(yùn)行后,默認(rèn)會(huì)開啟1條線程,稱為“主線程”或“UI線程”
主線程的主要作用
顯示\刷新UI界面
處理UI事件(比如點(diǎn)擊事件、滾動(dòng)事件、拖拽事件等)

主線程的使用注意:別將比較耗時(shí)的操作放到主線程中。
耗時(shí)操作會(huì)卡住主線程,嚴(yán)重影響UI的流暢度,給用戶一種“卡”的壞體驗(yàn)

5.代碼示例


//
//  YYViewController.m
//  01-阻塞主線程
//
//  Created by apple on 14-6-23.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()
- (IBAction)btnClick;
@end


@implementation YYViewController


- (void)viewDidLoad
{
  [super viewDidLoad];
}


//按鈕的點(diǎn)擊事件
- (IBAction)btnClick {
//1.獲取當(dāng)前線程
NSThread *current=[NSThread currentThread];
//2.使用for循環(huán)執(zhí)行一些耗時(shí)操作
for (int i=0; i<10000; i++) {
    //3.輸出線程
    NSLog(@"btnClick---%d---%@",i,current);
}
 }

 @end

執(zhí)行效果:



說明:當(dāng)點(diǎn)擊執(zhí)行的時(shí)候,textView點(diǎn)擊無(wú)響應(yīng)。



執(zhí)行分析:等待主線程串行執(zhí)行。

開啟子線程。


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

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

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