1、多線程原理?
多線程其實(shí)是個(gè)假象组力,因?yàn)镃PU同一時(shí)間只能處理一條線程县貌,多線程并發(fā)執(zhí)行,其實(shí)是CPU快速在多條
線程之間調(diào)度痪寻,如果CPU調(diào)度線程的時(shí)間足夠快螺句,就造成了多線程并發(fā)的假象。
2橡类、線程不建議開太多蛇尚,5條以內(nèi),因?yàn)殚_啟線程是要占內(nèi)存的顾画,單個(gè)線程隨線程增多效率降低取劫。主線程默認(rèn)1MB,
3亲雪、在iOS中線程有4種創(chuàng)建方式
1勇凭、pthread,通用API,跨平臺(tái)义辕,使用難度大虾标,是C語言寫的,需要程序員管理生命周期,幾乎不用璧函,使用價(jià)值不大
2傀蚌、NSThread 使用更加面向?qū)ο螅?jiǎn)單蘸吓,oc語言善炫,需要程序員管理生命周期,偶爾使用库继,一般是為了拿當(dāng)前線程[NSThread currentThread]和主線程[NSThread mainThread]
3箩艺、GCD 旨在替代NSThread等線程技術(shù),充分利用設(shè)備內(nèi)核宪萄,c語言 生命周期自動(dòng)管理艺谆,經(jīng)常使用
4、NSOperation 基于GCD 比GCD多了一些簡(jiǎn)單的功能拜英,使用更加面向?qū)ο?静汤,oc語言,生命周期自動(dòng)管理居凶,經(jīng)常使用
什么是串行隊(duì)列虫给、并發(fā)隊(duì)列?
這里有必要引入線程池的概念侠碧,通俗點(diǎn)講抹估,線程池就是一個(gè)裝線程的容器,用來管理線程的
串行隊(duì)列:串行隊(duì)列底層的線程池只要一個(gè)線程舆床,因此只提供一個(gè)線程用來執(zhí)行任務(wù)棋蚌,所以后一個(gè)任務(wù)必須等到前一個(gè)任務(wù)執(zhí)行結(jié)束才能開始執(zhí)行,我們可以理解為任務(wù)執(zhí)行方式是有序的
并發(fā)隊(duì)列:線程池提供多個(gè)線程來執(zhí)行任務(wù)挨队,按照FIFO的順序并發(fā)啟動(dòng)谷暮、執(zhí)行任務(wù)多個(gè)并發(fā)任務(wù)。
隊(duì)列的創(chuàng)建方式
//1盛垦、獲取主隊(duì)列
dispatch_queue_t queue = dispatch_get_main_queue()
//2湿弦、并發(fā)隊(duì)列
dispatch_queue_t queue = dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//3、并發(fā)隊(duì)列
dispatch_queue_t queue = dispatch_queue_create("a", DISPATCH_QUEUE_CONCURRENT);
//4腾夯、串行隊(duì)列
dispatch_queue_t queue = dispatch_queue_create("a", DISPATCH_QUEUE_SERIAL);
4颊埃、同步和異步
同步不會(huì)開辟新的線程,異步開辟新的線程
下面用GCD就講一講這4種隊(duì)列的區(qū)別
1蝶俱、同步串行隊(duì)列:順序執(zhí)行班利,不可以同時(shí)執(zhí)行, 不新開線程,主線程的同步會(huì)死鎖榨呆。
2罗标、異步串行隊(duì)列:順序執(zhí)行,不可以同時(shí)執(zhí)行,新開線程
3闯割、同步并發(fā)隊(duì)列:順序執(zhí)行彻消,不可以同時(shí)執(zhí)行,不新開線程宙拉,
4宾尚、異步并發(fā)隊(duì)列:可以同時(shí)并發(fā)執(zhí)行,新開線程
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"P怀骸;吞!锥忿!%@",[NSThread currentThread]);
});
NSLog(@"%@",[NSThread currentThread]);
在主線程中執(zhí)行崔步,都不會(huì)打印,主線程的同步隊(duì)列會(huì)死鎖,因?yàn)橥讲?會(huì)開辟新的線程缎谷,而串行隊(duì)列遵循FIFO的原則,主線程會(huì)一直執(zhí)行灶似,
新添加的同步主隊(duì)列要等原來的主隊(duì)列執(zhí)行完畢才能執(zhí)行列林,所以就會(huì)造
成死鎖的現(xiàn)象
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{
NSLog(@"%@",[NSThread currentThread]);//任務(wù)一
});
NSLog(@"!@也选O3铡!%@",[NSThread currentThread]);//任務(wù)二
先打印任務(wù)一春感,再打印任務(wù)二
這里有一篇文章詳細(xì)介紹了關(guān)于線程死鎖的問題
http://ios.jobbole.com/82622/