iOS多線程編程入門

進程 線程

  • 進程占據(jù)內存,而線程占據(jù)CPU澎蛛。一個進程可以有多個線程责循,進程之間可以通過管道 或者套接字(Socket)進行通信阀捅,而在一個進程中拂铡,多個線程相互之間可以直接 很方便的進行通信陨溅。使用多線程編程可以幫助我們的程序減少 程序出現(xiàn)卡頓 假死這些情況的出現(xiàn)(不阻塞主線程的執(zhí)行)终惑,使用起來可以極大的提升程序的用戶體驗,但是多線程也有一個不好的地方在于门扇,你線程開得多了雹有,對于其他進程來說就是一個不好的事情,其他進程占用的資源就會變少臼寄。所以我們在使用多線程編程編程的時候要注意這點問題霸奕。

  • 下面是一個使用多線程中NSOperation 的一個例子:

    兩個按鈕模擬多線程 一個按鈕點擊以后會睡眠10秒鐘 再執(zhí)行的響應的內容 另外一個按鈕點擊以后就會執(zhí)行相應的內容 但是不適用多線程編程的時候 你點擊了有睡眠的按鈕 第二個就不能點擊了 因為第二個要等待第一個按鈕完成它的全部事件以后才會執(zhí)行 這樣就造成了程序了卡頓 或者假死 所以這也是其我們要使用多線程編程的原因。

代碼區(qū)##

#import<UIKit/UIKit.h>

@interface ViewController : UIViewController

@end


#import<UIKit/UIKit.h>

@interface ViewController ()

@end

@implementation ViewController 

- (void)viewDidLoad {

[super viewDidLoad];

}

- (void) foo:(UIButton *) button {

// 休眠和退出都是只有正在執(zhí)行的線程可以調用的方法

// 因此在設計上這兩個方法都是類方法而不是對象方法

// [NSThread exit];

// [NSThread sleepForTimeInterval:10]; 的作用和sleep(10)是一樣的

sleep(10);

NSLog(@"任務1已經(jīng)完成!");

// 提示: 刷新界面的操作要回到主線程處理否則有可能失效

// [self performSelectorOnMainThread:@selector(bar:) withObject:button waitUntilDone:YES];

// 創(chuàng)建一個操作對象

NSOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(bar:) object:button];

// 向主線程隊列中添加操作對象(操作放到主線程中執(zhí)行)

[[NSOperationQueue mainQueue] addOperation:op];

}

//刷新界面以后 讓按鈕又可以再點擊  讓按鈕的文字恢復

- (void) bar:(UIButton *) button {

button.enabled = YES;

[button setTitle:@"任務1" forState:UIControlStateNormal];

}

- (IBAction)blueButtonClicked:(UIButton *)sender {

// 提示: 對于那些耗時間的任務基本上都應該放到其他的執(zhí)行線程中

// 不要阻塞主線程的執(zhí)行 否則界面會出現(xiàn)卡頓或假死現(xiàn)象

// 模擬任務需要執(zhí)行10秒鐘

[sender setTitle:@"正在執(zhí)行..." forState:UIControlStateNormal];

sender.enabled = NO;

// 創(chuàng)建一個操作對象(待會要將該操作放到一個隊列中去執(zhí)行)

NSOperation *op = [NSBlockOperation blockOperationWithBlock:^{

[self foo:sender];

}];

// 創(chuàng)建一個并發(fā)隊列

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

// 設置最大并發(fā)數(shù)量

queue.maxConcurrentOperationCount = 5;

// 向隊列中添加一個操作

[queue addOperation:op];

// [NSThread detachNewThreadSelector:@selector(foo:) toTarget:self withObject:sender];

// NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(foo:) object:sender];

// 啟動線程(執(zhí)行foo回調方法)

// [thread start];

// sleep(1);

// 提示: 如果線程已經(jīng)開始執(zhí)行則無法取消  --->如果不執(zhí)行前面的那個sleep(1)   線程可以被取消但是 執(zhí)行了sleep(1)以后線程就無法被取消了吉拳。

// [thread cancel];

// [self performSelectorInBackground:@selector(foo:) withObject:sender];

}

- (IBAction)yellowButtonClicked:(UIButton *)sender {

NSLog(@"任務2已經(jīng)完成!");

}

@end

補充說明:
補充一點: 如果我們的程序中 出現(xiàn)了多個線程競爭同一個資源的情況质帅,這個時候 我們需要對這個資源進行同步保護(synchronized) 讓線程處于一個排隊狀態(tài) ,當一個線程進入執(zhí)行的時候,鎖被鎖上临梗,然后其他進程無法進入涡扼。直到該線程完成了它的工作以后,它就會出來 然后鎖就會被打開 然后其他線程就接著一個一個的執(zhí)行盟庞。當然一個完成以后 另外一個進入的時候 并不是有順序排好隊的進入 就好比哪個運氣好 哪個就先進去吃沪。

  • 舉例說明:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//創(chuàng)建一個可變字符串作為多個線程共同競爭的一個資源

NSMutableString *mStr = [NSMutableString stringWithCapacity:10000];

//創(chuàng)建5個線程模擬競爭同一個資源

for(int i = 0;i < 5; i++){

[NSThread detachNewThreadSelector:@selector(foo:) toTarget:self withObject:mStr];

}

return YES;

}

-(void)foo:(NSMutableString *)mStr{

for(int i = 0; i < 10000;i++){

@synchronized(mStr){

[mStr appendString:@"a"];

                            }

                   }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市什猖,隨后出現(xiàn)的幾起案子票彪,更是在濱河造成了極大的恐慌,老刑警劉巖不狮,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件降铸,死亡現(xiàn)場離奇詭異,居然都是意外死亡摇零,警方通過查閱死者的電腦和手機推掸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驻仅,“玉大人谅畅,你說我怎么就攤上這事≡敕” “怎么了毡泻?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粘优。 經(jīng)常有香客問我仇味,道長,這世上最難降的妖魔是什么雹顺? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任丹墨,我火速辦了婚禮,結果婚禮上无拗,老公的妹妹穿的比我還像新娘带到。我一直安慰自己昧碉,他們只是感情好英染,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著被饿,像睡著了一般四康。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狭握,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天闪金,我揣著相機與錄音,去河邊找鬼。 笑死哎垦,一個胖子當著我的面吹牛囱嫩,可吹牛的內容都是我干的。 我是一名探鬼主播漏设,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼墨闲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了郑口?” 一聲冷哼從身側響起鸳碧,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犬性,沒想到半個月后瞻离,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡乒裆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年套利,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹤耍。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡日裙,死狀恐怖,靈堂內的尸體忽然破棺而出惰蜜,到底是詐尸還是另有隱情昂拂,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布抛猖,位于F島的核電站格侯,受9級特大地震影響,放射性物質發(fā)生泄漏财著。R本人自食惡果不足惜联四,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撑教。 院中可真熱鬧朝墩,春花似錦、人聲如沸伟姐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愤兵。三九已至鹿霸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秆乳,已是汗流浹背懦鼠。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工钻哩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肛冶。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓街氢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親睦袖。 傳聞我的和親對象是個殘疾皇子阳仔,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評論 25 707
  • 又來到了一個老生常談的問題,應用層軟件開發(fā)的程序員要不要了解和深入學習操作系統(tǒng)呢扣泊? 今天就這個問題開始近范,來談談操...
    tangsl閱讀 4,098評論 0 23
  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼延蟹,方法是什么评矩?如果想延時執(zhí)行代碼、方法又是什么阱飘? 1...
    AlanGe閱讀 1,721評論 0 17
  • 周三 晴 讀經(jīng)照舊 今晚有舞蹈課斥杜,媽媽叮囑爸爸,放學回家后讓橙子先把數(shù)學作業(yè)做了沥匈。這樣晚上跳舞回來可以早點休息蔗喂。今...
    圣鳳閱讀 354評論 0 0
  • 覺察日記+6月30日+乾珉+反6 我家那貨最近吃完飯就把碗筷鍋的扔在那里,不管高帖,我就很生氣缰儿,我要是吃的話我把廚房收...
    乾珉閱讀 133評論 0 0