多線程

線程是進(jìn)程的組成單位 線程是一段可重復(fù)使用的代碼塊
一個(gè)線程同一時(shí)間只能完成一個(gè)任務(wù)
一個(gè)線程執(zhí)行多任務(wù)時(shí) 串行執(zhí)行
異步數(shù)據(jù)請(qǐng)求使用的都是多線程 多個(gè)線程同時(shí)工作互不影響 并發(fā)

線程

主線程:UI線程 由編譯器自動(dòng)創(chuàng)建 不能修改 MAinThread
工作線程:次線程 有程序員創(chuàng)建 可隨意修改 workThread/secondThread
[原因]主線程在一定時(shí)間的范圍內(nèi)重復(fù)執(zhí)行某個(gè)動(dòng)作(重復(fù)調(diào)用某個(gè)函數(shù))出現(xiàn)屏幕假死 一定時(shí)間后屏幕才能恢復(fù)與用戶(hù)交互的效果 -- 解決方法 使用工作線程(工作線程完成重復(fù)操作)

線程的可行方式:

    NSThread
    NSOperationQueue
    GCD

多線程

1.NSThread

創(chuàng)建線程方式有兩種
使用類(lèi)方法創(chuàng)建線程對(duì)象
類(lèi)方法創(chuàng)建的線程對(duì)象 不需要開(kāi)啟 直接就會(huì)執(zhí)行SEL:函數(shù)
[NSThread detachNewThreadSelector:<#(nonnull SEL)#> toTarget:<#(nonnull id)#> withObject:<#(nullable id)#>]
使用實(shí)例方法創(chuàng)建線程對(duì)象 必須手動(dòng)開(kāi)啟線程 否則不會(huì)調(diào)用線程的執(zhí)行方法
NSThread * thread1 = [[NSThread alloc]initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>]
//開(kāi)始線程
[thread start];
添加間隔時(shí)間
[NSThread sleepForTimeInterval:0.5];
立即停止
[NSThread exit];

NSThread * thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(threadMain1:) object:@(20)];
[thread1 start];
NSDictionary * dic = @{@"thread":thread1,@"da":@(100)};
NSThread * thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(threadMain2:) object:dic];
[thread2 start];
判斷當(dāng)前線程是否接收到cancel消息
[[NSThread currentThread]isCancelled]
向線程1發(fā)送結(jié)束通知
[dic[@"thread"] cancel];

//為通知中心添加觀察者 觀察線程執(zhí)行結(jié)束
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(threadExists:) name:NSThreadWillExitNotification object:nil];
//獲取 調(diào)用該方法的線程
NSThread * thread = [NSThread currentThread];

線程鎖

NSLock * lock;
初始化線程鎖
lock = [[NSLock alloc]init];
同一資源只能被一個(gè)應(yīng)用 讀/寫(xiě)
如果某資源被一個(gè)應(yīng)用使用 則為該資源上鎖 使用完釋放訪問(wèn)權(quán)限

2.GCD(Grand Central Dispatch)多線程優(yōu)化技術(shù)

任務(wù):同步執(zhí)行 異步執(zhí)行( 區(qū)別;是否開(kāi)啟新線程)
隊(duì)列:串行隊(duì)列 并行隊(duì)列
遵守FIFO(先進(jìn)先出)
主線程
dispatch_queue_t main = dispatch_get_main_queue();
//開(kāi)啟新線程
//串行
開(kāi)啟新線程
@param label#> 標(biāo)識(shí) 用于標(biāo)識(shí)唯一線程/隊(duì)列 description#>
@param attr#> 用于標(biāo)識(shí)當(dāng)前隊(duì)列是串行還是并行 description#>
DISPATCH_QUEUE_SERIAL 串行
DISPATCH_QUEUE_CONCURRENT 并行
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
//并行
方式一
dispatch_queue_t queue2 = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
任務(wù)(同步,異步)
同步
1.任務(wù)放到哪個(gè)隊(duì)列中
2.執(zhí)行事件
dispatch_sync(queue, ^{
NSLog(@"同步");
});
異步
dispatch_async(queue, ^{
NSLog(@"異步");
});

GCD組
dispatch_group_t group = dispatch_group_create();
創(chuàng)建隊(duì)列
@param identifier#> 線程優(yōu)先級(jí) description#>
@param flags#> 標(biāo)示符 description#>

dispatch_queue_t queue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
將線程queue放到group組中
dispatch_group_async(group, queue3, ^{
});
將隊(duì)列放到組中,當(dāng)所有隊(duì)列任務(wù)執(zhí)行完畢后可提供通知
dispatch_group_notify(group, queue3, ^{
});

3.(封裝gcd)

NSOperationQueue(隊(duì)列)
NSOperation(任務(wù))

創(chuàng)建任務(wù)(需要手動(dòng)開(kāi)啟)
NSInvocationOperation * oper = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(refresh) object:nil];
開(kāi)啟
[oper start];

創(chuàng)建方式2(推薦使用)
NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"");
}];
任務(wù)結(jié)束回調(diào)
[operation setCompletionBlock:^{
NSLog(@"");
}];
[operation start];
隊(duì)列
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
創(chuàng)建任務(wù)放到隊(duì)列中
NSBlockOperation * oper = [NSBlockOperation blockOperationWithBlock:^{
}];
任務(wù)加到隊(duì)列中即可開(kāi)啟
[queue addOperation:oper];
添加線程依賴(lài) operation 執(zhí)行完再執(zhí)行oper
[oper addDependency:operation];

UI刷新操作必須回主線程
1.回到主線程進(jìn)行刷新操作
2.參數(shù)
3.是否終止線程 NO
[self performSelectorOnMainThread:@selector(main) withObject:nil waitUntilDone:NO];
dispatch_async(dispatch_get_main_queue(), ^{
//刷新UI
});
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
// 刷新UI
}];
延時(shí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子熊楼,更是在濱河造成了極大的恐慌冯凹,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件分歇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涂邀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)箱锐,“玉大人比勉,你說(shuō)我怎么就攤上這事【灾梗” “怎么了浩聋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)臊恋。 經(jīng)常有香客問(wèn)我衣洁,道長(zhǎng),這世上最難降的妖魔是什么抖仅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任坊夫,我火速辦了婚禮,結(jié)果婚禮上撤卢,老公的妹妹穿的比我還像新娘践樱。我一直安慰自己,他們只是感情好凸丸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布拷邢。 她就那樣靜靜地躺著,像睡著了一般屎慢。 火紅的嫁衣襯著肌膚如雪瞭稼。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天腻惠,我揣著相機(jī)與錄音环肘,去河邊找鬼。 笑死集灌,一個(gè)胖子當(dāng)著我的面吹牛悔雹,可吹牛的內(nèi)容都是我干的复哆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腌零,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梯找!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起益涧,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锈锤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后闲询,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體久免,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年扭弧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阎姥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸽捻,死狀恐怖呼巴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泊愧,我是刑警寧澤伊磺,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布盛正,位于F島的核電站删咱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏豪筝。R本人自食惡果不足惜痰滋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望续崖。 院中可真熱鬧敲街,春花似錦、人聲如沸严望。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)像吻。三九已至峻黍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拨匆,已是汗流浹背姆涩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惭每,地道東北人骨饿。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宏赘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绒北,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容