多線程實測01

1.主線程隊列中實測。

a.主線程隊列中不能執(zhí)行同步,線程阻塞。代碼中有異步和同步兩個執(zhí)行操作,當(dāng)同步執(zhí)行在前時,線程阻塞,無法走到異步代碼。當(dāng)異步執(zhí)行在前時,可以走到同步代碼,但是此時線程阻塞,異步代碼塊無法回調(diào),即異步代碼大括號里的部分無法執(zhí)行。

代碼:

dispatch_queue_t queue=dispatch_get_main_queue();

NSLog(@"主線程--\n%@",[NSThreadmainThread]);

dispatch_async(queue, ^{

NSLog(@"async線程01--\n%@",[NSThreadcurrentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"sync線程01--\n%@",[NSThreadcurrentThread]);

});

打?。?/p>

2017-05-25 15:54:39.278 GCD_TEST[22554:339346] 主線程--

{number = 1, name = main}

b.主隊列中異步執(zhí)行并未開啟新線程,且按執(zhí)行順序回調(diào)。執(zhí)行過程為:async線程01,async線程02,async線程03,回調(diào)async線程01,回調(diào)async線程02,回調(diào)async線程03。

代碼:

dispatch_queue_tqueue=dispatch_get_main_queue();

NSLog(@"主線程--\n%@",[NSThreadmainThread]);

dispatch_async(queue, ^{

NSLog(@"async線程01--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程02--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程03--\n%@",[NSThreadcurrentThread]);

});

打?。?/p>

2.自創(chuàng)串行隊列中實測。

a.同步操作不會開啟新線程,異步操作會開啟新線程,但是開啟數(shù)量應(yīng)在1到異步操作數(shù)量之間。例如我有3個異步操作,打印開啟了2個新線程。執(zhí)行順序,如異步在前,同步再后:1.執(zhí)行異步操作,2.執(zhí)行同步操作,3.執(zhí)行異步回調(diào),4.執(zhí)行同步回調(diào)。如同步在前異步在后:1.執(zhí)行同步操作,2,執(zhí)行同步回調(diào),3,執(zhí)行異步操作,4,執(zhí)行異步回調(diào)。

代碼:

dispatch_queue_tqueue=dispatch_queue_create("自創(chuàng)串行隊列",DISPATCH_QUEUE_SERIAL);

NSLog(@"主線程--\n%@",[NSThreadmainThread]);

dispatch_async(queue, ^{

NSLog(@"async線程01--\n%@",[NSThreadcurrentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"sync線程01--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程02--\n%@",[NSThreadcurrentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"sync線程02--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程03--\n%@",[NSThreadcurrentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"sync線程03--\n%@",[NSThreadcurrentThread]);

});

打印:

b.自創(chuàng)串行隊列中異步執(zhí)行有開啟新線程,當(dāng)隊列中只有異步操作時只開啟了一條新線程,實測9個異步操作只開啟了一條新線程,跟a中的情況有所不同。同樣按執(zhí)行順序回調(diào)。執(zhí)行過程為:async線程01,async線程02,async線程03...回調(diào)async線程01,回調(diào)async線程02,回調(diào)async線程03...

代碼:

dispatch_queue_tqueue=dispatch_queue_create("自創(chuàng)串行隊列",DISPATCH_QUEUE_SERIAL);

NSLog(@"主線程--\n%@",[NSThreadmainThread]);

dispatch_async(queue, ^{

NSLog(@"async線程01--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程02--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程03--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程04--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程05--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程06--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程07--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程08--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程09--\n%@",[NSThreadcurrentThread]);

});

打?。?/p>

3.全局并行隊列實測。

在全局并行隊列中,同步操作未開辟新線程,異步操作開辟多個新線程,實測3個異步操作,打印開辟3個新線程。需要注意的是,當(dāng)同步操作在異步操作之前時,總是在同步操作回調(diào)結(jié)束后才會執(zhí)行異步操作。因為,不管是同步操作還是異步操作,在執(zhí)行之前,都處于同一線程下,都遵循先進(jìn)先出的原則。我們應(yīng)該講一個block看成兩個部分,一個就是block對象,第二個就是block大括號里的執(zhí)行部分。同步操作和異步操作之分在于,同步操作將block對象和其回調(diào)部分都以順序添加在當(dāng)前線程中,而異步操作則是將block對象添加在當(dāng)前順序中,而其回調(diào)部分則另開線程去處理。所以,不管是串行隊列還是并行隊列,只要同步操作在異步操作之前,那就是先執(zhí)行完同步操作的回調(diào)再去執(zhí)行異步操作。

代碼:

dispatch_queue_tqueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

NSLog(@"主線程--\n%@",[NSThreadmainThread]);

dispatch_sync(queue, ^{

NSLog(@"sync線程01--\n%@",[NSThreadcurrentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"sync線程02--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程01--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程02--\n%@",[NSThreadcurrentThread]);

});

dispatch_async(queue, ^{

NSLog(@"async線程03--\n%@",[NSThreadcurrentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"sync線程03--\n%@",[NSThreadcurrentThread]);

});

打印:

其中sync線程01,sync線程02回調(diào)總是按順序在最前面,另外四個操作回調(diào)順序不能確定。

4.串行隊列和并行隊列差異實測。

串行決定該隊列上的任務(wù)完成一個再執(zhí)行下一個,并行決定該隊列上的任務(wù)不必須等上一個任務(wù)完成再執(zhí)行下一個。

a.串行隊列下,同步回調(diào)中插入一個同步任務(wù)。執(zhí)行順序:1.走第一個同步任務(wù),2.走第一個同步的回調(diào)任務(wù),3.走插入的同步任務(wù),4.走插入的同步的回調(diào)任務(wù)(這一步走不下了,線程已經(jīng)被阻塞,因為2沒有走完)。

注:串行隊列下異步回調(diào)中插入一個同步任務(wù)跟a的情況一樣,如果插入的是異步任務(wù)順利執(zhí)行。

代碼:

dispatch_queue_tqueue=dispatch_queue_create("自創(chuàng)串行隊列",DISPATCH_QUEUE_SERIAL);

NSLog(@"主線程--\n%@",[NSThreadmainThread]);

dispatch_sync(queue, ^{

NSLog(@"sync線程01--\n%@",[NSThreadcurrentThread]);

dispatch_sync(queue, ^{

NSLog(@"sync線程02--\n%@",[NSThreadcurrentThread]);

});

});

打?。?/p>

b.并行隊列下,同步回調(diào)中插入一個同步任務(wù)。執(zhí)行順序:1.走第一個同步任務(wù),2.走第一個同步的回調(diào)任務(wù),3.走插入的同步任務(wù),4.走插入的同步的回調(diào)任務(wù)(線程未阻塞,因為并行不需要等2走完)。

注:并行隊列下異步回調(diào)中插入一個同步任務(wù)跟b的情況一樣,如果插入的是異步任務(wù)順利執(zhí)行。

代碼:

dispatch_queue_tqueue=dispatch_queue_create("自創(chuàng)并行隊列",DISPATCH_QUEUE_CONCURRENT);

NSLog(@"主線程--\n%@",[NSThreadmainThread]);

dispatch_sync(queue, ^{

NSLog(@"sync線程01--\n%@",[NSThreadcurrentThread]);

dispatch_sync(queue, ^{

NSLog(@"sync線程02--\n%@",[NSThreadcurrentThread]);

});

});

打?。?/p>

結(jié)語:自己動手,把可能遇到的線程組合情況一一試驗,就會加深其中的理解。另外自創(chuàng)并行隊列和全局并行隊列運行效果一致,就不再贅述。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容