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);
-
-
- });
- 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);
-
-
-
- });
- dispatch_release(queue);
當主線程在等待信號量時,操做系統會直接將它掛起,所以不會去死作標誌輪詢,而可以及時將CPU資源給其它可被調度的線程使用。app
- __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);
-
-
- dispatch_semaphore_signal(sem);
- });
-
-
- 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 Queueasync
- dispatch_queue_t mainQueue = dispatch_get_main_queue();
針對以上3種隊列:concurrent queues和main queue都是由系統生成並且 dispatch_suspend, dispatch_resume, dispatch_set_context這些函數對他們無效。函數
可是咱們的應用不是簡單的同步也異步的運行,應用常常是混合的。oop
好比咱們要task1 task2 task3都運行完成後才能異步運行task4 task5 task6咱們該怎麼作呢?這裏咱們能夠引入group的概念。this
- -(void)sixthMethod{
-
- dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
-
- dispatch_group_t queueGroup = dispatch_group_create();
-
- dispatch_group_async(queueGroup, aQueue, ^{
- NSLog(@"task 1.");
- });
-
- dispatch_group_async(queueGroup, aQueue, ^{
- NSLog(@"task 2.");
- });
-
- 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();
-
- dispatch_group_async(queueGroup, aQueue, ^{
- NSLog(@"task 4.");
- });
-
- dispatch_group_async(queueGroup, aQueue, ^{
- NSLog(@"task 5.");
- });
-
- 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.