最近開始學(xué)習(xí)多線程相關(guān)的知識爆哑,所以寫篇文章記載下,會因不斷的學(xué)習(xí)而做出持續(xù)的更新和糾正舆吮。
參考資料:NSThread揭朝、NSOperation、NSOperationQueue色冀、iOS多線程GCD
iOS里用到的多線程的方案主要需要了解的有GCD和NSOperation & NSOperationQueue潭袱,掌握這倆就夠了。
GCD
GCD中有兩個非常重要的概念:任務(wù) 和 隊列锋恬。
任務(wù)就是block中的一個個代碼塊屯换。有兩種,同步和異步,主要區(qū)別是
同步任務(wù):完成需要做的任務(wù)后才會返回彤悔,進行下一任務(wù)
異步任務(wù):無需完成任務(wù)即可立即返回嘉抓。
隊列就是用來存放任務(wù)的,分為串行和并行晕窑。
串行隊列:任務(wù)依據(jù)FIFO一個一個的按順序執(zhí)行抑片。
并行隊列:任務(wù)也依據(jù)FIFO來取出孩等,但是由于取出的速度很快颜懊,可以看作是同時執(zhí)行多個任務(wù)。
同步任務(wù)對應(yīng)的方法是:dispatch_sync
異步任務(wù)對應(yīng)的是:dispatch_async
串行隊列:DISPATCH_QUEUE_SERIAL;
并行隊列:DISPATCH_QUEUE_CONCURRENT;
這里給出一個案例:
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);// 串行隊列
NSLog(@"之前-%@",[NSThread currentThread]);===================0
dispatch_async(queue, ^{
NSLog(@"sync之前-%@",[NSThread currentThread]);================1
dispatch_sync(queue, ^{
NSLog(@"sync-%@",[NSThread
currentThread]);===================2
});
NSLog(@"sync之后-%@",[NSThread currentThread]);=================3
});
NSLog(@"之后-%@",[NSThread currentThread]);===================4
最終打印的結(jié)果是:0恼除、4疾牲、1
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);// 并行隊列
NSLog(@"之前-%@",[NSThread currentThread]);===================0
dispatch_async(queue, ^{
NSLog(@"sync之前-%@",[NSThread currentThread]);================1
dispatch_sync(queue, ^{
NSLog(@"sync-%@",[NSThread currentThread]);===================2
});
NSLog(@"sync之后-%@",[NSThread currentThread]);=================3
});
NSLog(@"之后-%@",[NSThread currentThread]);===================4
輸出結(jié)果是0植捎、4、1阳柔、2鸥跟、3
這是因為:首先這是一個異步的,所以不會影響盔沫,先執(zhí)行0医咨、4,而內(nèi)部1架诞、3是父任務(wù)拟淮,2是子任務(wù),當(dāng)是串行隊列的時候谴忧,要等父任務(wù)執(zhí)行完才能執(zhí)行子任務(wù)很泊,所以2要等1、3執(zhí)行完才能執(zhí)行沾谓,而又由于2是在同步線程里的委造,所以又要求按照1、2均驶、3的順序昏兆,這樣就導(dǎo)致2、3在互相等妇穴,所以會產(chǎn)生阻塞爬虱。而在并行隊列中,子任務(wù)不需要等父任務(wù)執(zhí)行完就可以執(zhí)行腾它,但是子任務(wù)必須自己執(zhí)行完才能執(zhí)行下一步跑筝,所以順序是1、2瞒滴、3曲梗,不會產(chǎn)生阻塞。