一、異步函數和並行隊列併發
注意:這些任務都是在建立完以後才執行。異步函數+併發隊列,能夠新建線程,各線程也是併發執行的。異步
1 //第一種:系統方法建立併發隊列(全局隊列) 2 /** 3 * <#Description#> 4 * 5 * @param identifier#> 優先級(有四個) description#> 6 * @param flags#> 系統保留關鍵字,暫時寫0 description#> 7 * 8 * @return <#return value description#> 9 */ 10 dispatch_queue_t queueSys = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 11 12 //第二種:本身方法建立 13 dispatch_queue_t queueO = dispatch_queue_create("queueO", DISPATCH_QUEUE_CONCURRENT);
//併發 + 異步 number = 3, name = (null) 也就是說異步開啓子線程 dispatch_async(queueSys, ^{ NSLog(@"併發 + 異步 %@",[NSThread currentThread]); });
二、同步函數+併發隊列async
注意:這些任務都是建立一個就立馬執行,執行完才建立下一個,由於是同步函數,因此不新建線程,只要是同步函數,就不會新建線程。併發隊列與否,並不影響同步函數的建立,由於自己就不能多建立線程,也就不存在併發ide
//併發 + 同步 dispatch_sync(queueSys, ^{ NSLog(@"併發 + 同步 %@",[NSThread currentThread]); });
三、異步函數+串行隊列函數
注意:這個搭配能夠新建線程,可是由於是串行隊列,因此實際上也只是開了一條新線程,作完一個,再作另外一個。spa
1 //第一種:系統提供的串行隊列方式(串行隊列中比較實用,經常使用在開發中)
注意:由於主隊列是串行隊列,並且是主線程執行的,只要加到主隊列就必定是加載主線程,不管是同步仍是異步
2 dispatch_queue_t queue = dispatch_get_main_queue();//主隊列 3 4 //第二種: 5 dispatch_queue_t queue1 = dispatch_queue_create("queue", 0); 6 7 //將任務添加到隊列當中 8 //串行隊列 + 異步任務:只開一個子線程 9 dispatch_async(queue1, ^{ 10 NSLog(@"串行 + 異步 %@",[NSThread currentThread]); 11 }); 12 13 /** 14 * 線程鎖死 15 * 緣由1:dispatch_sync在等待任務執行完成,可是任務又被添加到主線程裏,因此在主線程裏執行,因此dispatch_syn在主線程中調用,就會形成鎖死 16 dispatch_queue_t queue = dispatch_get_main_queue();//主隊列 17 dispatch_sync(queue1, ^{ 18 NSLog(@"串行 + 同步 %@",[NSThread currentThread]); 19 }); 20 * 緣由2:dispatch_sync是同步的,自己就會阻塞線程,就是主線程,往如今又網主線程裏添加任務,就會發生鎖死,因此不用系統自帶主隊列建立,用create
嵌套也會卡死
//串行隊列 + 同步任務: dispatch_sync(queue1, ^{ //串行隊列 + 同步任務: dispatch_sync(queue1, ^{ NSLog(@"串行 + 同步 %@",[NSThread currentThread]); }); NSLog(@"串行 + 同步 %@",[NSThread currentThread]); });
21 * @return <#return value description#> 22 */
四、同步函數+串行線程
注意:這樣既不會開新線程,也是串行執行的code
//串行隊列 + 同步任務: dispatch_sync(queue1, ^{ NSLog(@"串行 + 同步 %@",[NSThread currentThread]); });