1.串列隊列:Dispatch Queues或者 Serial Queues
同步
dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil); dispatch_sync(queue, ^(void) { sleep(2-i/50); NSLog(@"The sum is: %d", i); //flag = YES; });dispatch_release(queue);
非同步
dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil); dispatch_async(queue, ^(void) { sleep(2-i/50); NSLog(@"The sum is: %d", i); // signal the semaphore //dispatch_semaphore_signal(sem); });dispatch_release(queue);
當主線程在等待訊號量時,作業系統會直接將它掛起,因此不會去死做標誌輪詢,而能夠及時將CPU資源給其它可被調度的線程使用。
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0); dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil); dispatch_async(queue, ^(void) { sleep(2-i/50); NSLog(@"The sum is: %d", i); // signal the semaphore dispatch_semaphore_signal(sem); }); // wait for the semaphore dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); dispatch_release(queue);
2.並發隊列 :Concurrent Queues
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_queue_t aHQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t aLQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
3.主隊列:main dispatch Queue
dispatch_queue_t mainQueue = dispatch_get_main_queue();
針對以上3種隊列:concurrent queues和main queue都是由系統產生而且 dispatch_suspend, dispatch_resume, dispatch_set_context這些函數對他們無效。
但是我們的應用不是簡單的同步也非同步運行,應用經常是混合的。
比如我們要task1 task2 task3都運行完成後才能非同步運行task4 task5 task6我們該怎麼做呢?這裡我們可以引入group的概念。
-(void)sixthMethod{ //擷取concurrent queue dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //建立1個queue group dispatch_group_t queueGroup = dispatch_group_create(); //任務1 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 1."); }); //任務2 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 2."); }); //任務3 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 3."); }); NSLog(@"wait task 1,2,3."); //等待組內任務全部完成 dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER); NSLog(@"task 1,2,3 finished."); //釋放組 dispatch_release(queueGroup); //重新建立組 queueGroup = dispatch_group_create(); //任務4 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 4."); }); //任務5 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 5."); }); //任務6 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 6."); }); NSLog(@"wait task 4,5,6."); //等待組內任務全部完成 dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER); NSLog(@"task 4,5,6 finished."); //釋放組 dispatch_release(queueGroup); }
代碼運行結果:
2013-05-13 13:55:33.783 GDC[2466:1303] task 1.
2013-05-13 13:55:33.783 GDC[2466:3a07] task 3.
2013-05-13 13:55:33.783 GDC[2466:c07] wait task 1,2,3.
2013-05-13 13:55:33.783 GDC[2466:1903] task 2.
2013-05-13 13:55:33.787 GDC[2466:c07] task 1,2,3 finished.
2013-05-13 13:55:33.788 GDC[2466:c07] wait task 4,5,6.
2013-05-13 13:55:33.788 GDC[2466:1303] task 4.
2013-05-13 13:55:33.788 GDC[2466:1903] task 5.
2013-05-13 13:55:33.788 GDC[2466:3a07] task 6.
2013-05-13 13:55:33.790 GDC[2466:c07] task 4,5,6 finished.