IOS使用多線程有三種方法NSThread、NSOperation和NSOperationQueue、GCD;多線程
GCD學習(一)併發
(1)異步和同步
異步
dispatch_sync(queue, ^{ NSLog(@"這是同步線程"); }); dispatch_async(queue, ^{ NSLog(@"這是異步線程"); });
(2)並行隊列和串行隊列async
//並行隊列 //dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//系統默認的並行隊列 dispatch_queue_t concurrentQuueue = dispatch_queue_create("com.itt.crq", DISPATCH_QUEUE_CONCURRENT);//自定義並行隊列 dispatch_async(concurrentQuueue, ^{ NSLog(@"task1"); }); dispatch_async(concurrentQuueue, ^{ NSLog(@"task2"); }); //串行隊列 dispatch_queue_t serialQueue = dispatch_queue_create("con.itt.srq", DISPATCH_QUEUE_SERIAL); dispatch_async(serialQueue, ^{ NSLog(@"task1"); }); dispatch_async(serialQueue, ^{ NSLog(@"task2"); });
(3)任務組學習
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, myQueue, ^{ NSLog(@"task1"); }); dispatch_group_async(group, myQueue, ^{ NSLog(@"task1"); }); dispatch_group_async(group, myQueue, ^{ NSLog(@"task3"); }); NSLog(@"wait 1 2 3"); dispatch_group_wait(group, DISPATCH_TIME_FOREVER); NSLog(@"task 1 2 3 finished");
(4)dispatch_group_enter、dispatch_group_leave和dispatch_group_wait來實現進程同步spa
//dispatch_group_enter和dispatch_group_leave必須成對出現 dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_enter(group); dispatch_group_async(group, myQueue, ^{ NSLog(@"again"); sleep(5); dispatch_group_leave(group); }); dispatch_group_enter(group); dispatch_group_async(group, myQueue, ^{ NSLog(@"next"); sleep(10); dispatch_group_leave(group); }); NSLog(@"start"); NSLog(@"waiting"); dispatch_group_wait(group, DISPATCH_TIME_FOREVER);//dispatch_group_wait表示等待任務組執行完畢 NSLog(@"finish");
(5)信號量(控制併發)線程
實例一: dispatch_group_t group = dispatch_group_create(); dispatch_semaphore_t semaphore = dispatch_semaphore_create(10); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); for (int i = 0; i < 100; i++) { dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_group_async(group, queue, ^{ NSLog(@"%i",i); sleep(2); dispatch_semaphore_signal(semaphore); }); } dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 實例二: dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); dispatch_async(queue, ^{ NSLog(@"waiting create data"); sleep(5); NSLog(@"create data complete"); dispatch_semaphore_signal(semaphore); }); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_async(queue, ^{ NSLog(@"haha~,I am get data complete"); });
實例一程序運行會先建立10個新的線程,以後每當有線程執行結束,都會建立一個線程;實例二5秒後輸出「haha~,I am get data complete」。code