IOS 多執行緒程式設計指南之NSThread

2021-07-11 20:53:33 字數 3281 閱讀 6486

1.nsthread基本運用

-(void)pressbtn:(uibutton*)btn}}

這樣就需要開啟另外乙個執行緒,開啟的方式有兩種

第一種:alloc init 需要手動的start 和cancel

-(void)pressbtnmuti:(uibutton*)btnmuti

-(void)thread01}}

第二種建立方式,直接開啟並執行的乙個執行緒,執行完方法程自動關閉

-(void)pressbtn

-(void)thread02

2.執行緒執行順序

當乙個方法同上開啟另個執行緒,是執行順序是不確定的,又系統資源決定的

-(void)touchesbegan:(nsset *)touches withevent:(uievent *)event

以下執行方法

conut1 final=200?

conut1 final=200?

不確定的,因為都是非同步執行緒執行的方法,誰先執行完不確定,所以conut1 ,count2只有乙個等於200,另乙個不確定

而且每次run 結果極有可能不一樣,考慮執行緒安全,需要上鎖

-(void)threadcount01

nslog(@"conut1 final=%d",_count);

}-(void)threadcount02

nslog(@"conut2 final=%d",_count);

}

同樣的例子更加可以說明,執行緒是有作業系統資源決定

-(void)pressbtnmuti:(uibutton*)btn

-(void)threadadd

}-(void)threadminus

}

執行結果等一段時間 value的值是不確定的

3.關於執行緒鎖,多個執行緒對同乙個陣列進行訪問,讀寫操作都要考慮加鎖

//不考慮執行緒安全

-(void)addelment:(nsobject*)elem

if ([_arrayqueue count]>kmaxarrayqueue)

[_arrayqueue addobject:elem];

}//不考慮執行緒安全

-(id)getelement

-(void)addelmentthreadsafty:(id)obj

-(id)getelementthreadsafty

4.執行緒可以手動的取消

- (void)run

nslog(@"-----%@----%d" , [nsthread currentthread].name, i);

// 每執行一次,執行緒暫停0.5秒

[nsthread sleepfortimeinterval:0.5];

}}- (ibaction)cancelthread:(id)sender

5.執行緒的優先順序, 改變執行緒的優先順序,可以改變輸出順序

優先順序相同,輸出不確定,當不一樣的時候優先順序高的for迴圈先執行完,然後執行另外優先順序低的for迴圈

- (void)viewdidload

- (void)run

}

6.應用舉例1

在乙個迴圈(for i in 20)裡開啟另外乙個執行緒,另外乙個執行緒執行乙個(for i in 5),請問列印結果?

- (void)viewdidload

for(int i = 0 ; i < 20 ; i++)

[thread start];

// // 建立並啟動新執行緒

// [nsthread detachnewthreadselector:@selector(run) totarget:self

// withobject:nil];}}

}- (void)run

}

列印結果:

如果再次run一下,列印結果為:

為何不一樣呢,因為開啟的執行緒,不是在主線程,而且是非同步執行,什麼時候開始執行,取決於系統資源,所以會不一致

7.應用舉例2

利用nsthread如何實現適時更改uiprogressview的進度條呢?,

方法:開啟乙個非同步執行緒,執行方法改變progress,執行主線程方法,改變ui,屬於非同步執行,同步ui

//使用主線程來呼叫函式

-(void)pressmian

//主線程主使用

//方法一:

-(void)updateprogressmain:(uiprogressview*)pview

}#pragma mark 開啟乙個非同步執行緒,執行方法改變progress,執行主線程方法,改變ui,屬於非同步執行,同步ui

//方法二:

-(void)pressmian2

-(void)updateprogress02

}//主線程中執行函式

-(void)changeprogress

}#pragma mark 開啟普通執行緒,進度條會在progress=1是突然出現

//開啟普通執行緒

-(void)pressthread

//普通執行緒函式

-(void)updateprogress }}

- (ibaction)showimage:(id)sender

// 定義乙個方法作為執行緒執行體。

-(void)downloadimagefromurl:(nsstring *) url

else

}-(void)updateui:(uiimage*) image

關於執行緒和程序的基本概念一篇比較好的部落格參考:

多執行緒程式設計指南

老狼推薦 多執行緒程式設計指南 最後希望這篇文件能幫上那些感覺看官方英文文件困難的人。如果可以我還是推薦盡量檢視英文原文件,畢竟那是原汁原味,翻譯總無法避免有一定的疏漏。下期預告 core data 程式設計指南 以下提供目錄預覽 目錄推薦資源 核心動畫程式設計指南 core animation p...

iOS多執行緒程式設計入門

程序 執行緒 區 import inte ce viewcontroller uiviewcontroller end 複製 補充說明 補充一點 如果我們的程式中 出現了多個執行緒競爭同乙個資源的情況,這個時候 我們需要對這個資源進行同步保護 synchronized 讓執行緒處於乙個排隊狀態 當乙...

Java多執行緒程式設計模式實戰指南之Promise模式

本書其它部分內容也在本站發表過,詳見 promise模式簡介 promise模式是一種非同步程式設計模式 它使得我們可以先開始乙個任務的執行,並得到乙個用於獲取該任務執行結果的憑據物件,而不必等待該任務執行完畢就可以繼續執行其他操作。等到我們需要該任務的執行結果時,再呼叫憑據物件的相關方法來獲取。這...