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模式是一種非同步程式設計模式 它使得我們可以先開始乙個任務的執行,並得到乙個用於獲取該任務執行結果的憑據物件,而不必等待該任務執行完畢就可以繼續執行其他操作。等到我們需要該任務的執行結果時,再呼叫憑據物件的相關方法來獲取。這...