IOS開發多線程-多線程技術1

來源:互聯網
上載者:User

標籤:

一、基本概念1.什麼是進程

進程就是指在系統中正在運行的一個應用程式

每個應用之間是相互獨立的

每個進程都運行在其專有的並且受保護的記憶體空間內。 

2.什麼是線程 

一個進程想要執行程式,就必須需要一個線程,

線程是程式執行的基本單元,應用的所有的任務都線上程中執行的。 

當程式啟動之後,系統會自動為進程建立一條線程,稱之為 “主線程”  “UI線程”

 

 

3.線程的串列 

一個線程執行任務是串列的,也就是說,在一個線程內,執行任務是從順序執行的 

同一時間,線程只能執行一個任務----> CPU在同一時間也只能執行一個線程

   

 二、多線程  1.什麼是多線程 

多線程指的是,在同一個進程中,建立多個線程,每個線程"並發(同時)“執行各自的任務。

可以有效提高系統的效率 

如下,當CPU快速的切換三條線程,就可以產生並發效果

2.多線程的原理 

同一時間,CPU只能執行一個線程,只能又一個線程在執行;

當多線程並發的時候,CPU在多個線程之間快速的調度(切換),就能產生並發(同時)執行的現象。

 注意: 並發執行,是一種假象,看起來是同時執行的。

   並行只是,是真正的同時執行。 

3.多線程的優缺點 

優點:

能夠提高程式的執行效率

能適當的提高系統資源的利用率 

缺點

開啟線程是需要一定的記憶體空間的(預設:主線程 1M  子線程  512B),如果開啟太多線程,會佔用過多的記憶體空間;

線程越多,CPU線上程調度上的消耗增多;

線程越多,相同時間內,每個線程調度是次數就越少;

程式設計更加複雜,例如:線程之間的通訊、線程之間的資料共用等問題; 

注意:系統建立的線程稱為"主線程",其他的線程稱為"子線程"。

三、多線程的應用 1.主線程

主線程:當進程開啟的時候,系統預設會開啟 一條線程,稱為:"主線程" 或"UI線程"; 

作用:

顯示/重新整理UI介面

處理UI介面(例如 點擊、滾動、拖拽等) 

2.主線程的注意事項

為了更加良好的使用者體驗,不要講耗時較長的任務放在主線程中,否則會影響UI的流暢度,造成卡頓的現象 

例如:

如果耗時較長(10s),那麼主線程是會一直停留在該任務中,直到任務完成,當第5s點擊時候,無法立即響應使用者的點擊事件 

   

將耗時較長的任務放在子線程之後,能夠立即相應使用者的點擊事件

 

 

四、IOS多線程的實現方案

  

五、pthread 和NSThread的簡單介紹

 

1.pthread的簡單介紹

建立的函數:

 int pthread_create(pthread_t * __restrict, const pthread_attr_t * __restrict,void *(*)(void *), void * __restrict); 

pthread_t *restrict:線程標識符的地址

const pthread_attr_t *restrict:設定線程的屬性

void *(*)(void *):線程中執行的函數.

void *restrict:傳遞給執行函數的參數. 可以傳一個任意類型的參數

C語言中de void * 等同於 OC中的 id    

傳回值: 返回 0 代表線程建立成功

返回其他數值,代表線程建立失敗,.返回的數值,是失敗的狀態 

注意:

     在ARC的環境下面,C語言和OC不能直接傳遞

     __bridge 橋接:C語言沒有自動記憶體管理,需要對C語言代碼進行添加自動記憶體操作,只有在ARC環境下才需要

     OC:在 ARC環境下,不需要手動添加自動記憶體管理(retain/release/autorelease/)

     添加的目的,就是告訴編譯器,為OC代碼添加自動記憶體管理代碼

 

對該檔案編譯環境設定:

非ARC機制 -fno-objc-arc

ARC : -fobjc-arc

 

代碼:

#import "ViewController.h"#import <pthread.h>@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{    [super viewDidLoad];}- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{    // 建立一個線程標識符    pthread_t myThread;    NSString* str = @"pthread";        int result = pthread_create(&myThread, NULL, longTimeOperation, str);    NSLog(@"%d",result);}void*(longTimeOperation)(void* data){    NSLog(@"----%@------%@", data, [NSThread currentThread]);    return NULL;}@end

 

2.NSThread的介紹 1> 線程的建立和啟動 

一個NSThread就代表這一個對象 

建立啟動

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread start]; 

線程一啟動,就是告訴CPU已經"就緒",當CPU調度該線程的時候,就會執行相應的方法。

 

建立線程後自動啟動線程

[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

 

隱式建立並啟動線程

[self performSelectorInBackground:@selector(run) withObject:nil];

 

提示: 後兩種建立的方式,無法獲得該線程對象,就不能對其進行更加詳細的設定

 

2>常用的方法 

主線程相關的:

+ (NSThread *)mainThread; // 獲得主線程

- (BOOL)isMainThread; // 是否為主線程

+ (BOOL)isMainThread; // 是否為主線程

 

獲得當前線程:

NSThread *current = [NSThread currentThread];

 

線程的調度優先順序

+ (double)threadPriority;

+ (BOOL)setThreadPriority:(double)p;

- (double)threadPriority;

- (BOOL)setThreadPriority:(double)p;

調度優先順序的取值範圍是0.0 ~ 1.0,預設0.5,值越大,優先順序越高 

 

線程的名字

- (void)setName:(NSString *)n;

- (NSString *)name; 

 

六、線程的狀態

 

1、線程的狀態

線程一共有四種狀態:就緒、運行、阻塞、死亡。

  

注意:當線程進入阻塞狀態後,會從可調度線程池裡面移除

 

2、線程狀態的相關方法 

啟動線程(進入就緒狀態)

- (void)start;

 

阻塞(暫停)線程(進入阻塞狀態)

+ (void)sleepUntilDate:(NSDate *)date;

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

 

強制停止線程(進入死亡狀態)

+ (void)exit;

 

七、線程鎖 1、引入:安全執行緒問題(多個線程訪問同一塊資料)

 

 。。。。。未完待續

IOS開發多線程-多線程技術1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.