GCD

#import "ViewController.h"

@interface ViewController ()

@end
/*
 GCD 核心概念:將任務添加隊列,指定任務執行的方法
 
 -任務
    - 使用block 封裝
    - block 就是一個提早準備好的代碼塊,須要的時候執行

 -隊列
    - 串行隊列:一個接一個的執行任務
    - 併發隊列:能夠同時調度多個任務
 -任務執行函數(任務都須要在線程中執行)
    - 同步執行:不會到線程池裏面去獲取子線程
    - 異步執行:只要有任務,就會去線程池取子線程(主隊列除外)
 
 
 小結:
  -- 開不開線程,取決於執行任務的函數,同步不開,異步就開
  -- 開幾條線程,取決於隊列,串行開一條,併發開多條(異步)
 
 */


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self gcdDemo7];
}
//全局隊列
//Mark:全局隊列(本質上是一個併發隊列)
-(void)gcdDemo7
{
    //全局隊列
    
    /*
     參數
     1:涉及系統適配
     iOS 8.0 服務質量
     QOS_CLASS_USER_INTERACTIVE  用戶交互(但願線程快速執行,不要放一些耗時操做)
     QOS_CLASS_USER_INITIATED    用戶須要的(不要放一些耗時操做)
     QOS_CLASS_DEFAULT           默認
     QOS_CLASS_UTILITY           使用工具(用來耗時操做)
     QOS_CLASS_BACKGROUND        後臺
     QOS_CLASS_UNSPECIFIED       沒有指定優先級
     
     iOS 7.0 調度優先級
     DISPATCH_QUEUE_PRIORITY_HIGH      高優先級
     DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默認優先級
     DISPATCH_QUEUE_PRIORITY_LOW (-2)  低優先級
     DISPATCH_QUEUE_PRIORITY_BACKGROUND 後臺優先級
     
     
     參數2:爲將來的保留參數
     
     提示:尤爲不要選擇BACKGROUND  ,線程執行會慢到使人髮指!
     */
    
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);//前者:優先級  後者:保留值
    
    for (int i = 0; i < 10; i++) {
        
        dispatch_async(q, ^{ // sync
            NSLog(@"%@ %d",[NSThread currentThread],i);
            
        });
       
    }
     NSLog(@"Come here");
    /*
     2018-05-07 18:11:01.401836+0800 003 GCD演示[86602:5136701] Come here
     2018-05-07 18:11:01.402103+0800 003 GCD演示[86602:5136760] <NSThread: 0x600000461b80>{number = 3, name = (null)} 0
     2018-05-07 18:11:01.402121+0800 003 GCD演示[86602:5136759] <NSThread: 0x604000272f40>{number = 4, name = (null)} 1
     2018-05-07 18:11:01.402156+0800 003 GCD演示[86602:5136761] <NSThread: 0x600000461f80>{number = 5, name = (null)} 2
     2018-05-07 18:11:01.402204+0800 003 GCD演示[86602:5136768] <NSThread: 0x604000273000>{number = 6, name = (null)} 3
     2018-05-07 18:11:01.402478+0800 003 GCD演示[86602:5136762] <NSThread: 0x604000273040>{number = 7, name = (null)} 4
     2018-05-07 18:11:01.402593+0800 003 GCD演示[86602:5136821] <NSThread: 0x604000272f80>{number = 9, name = (null)} 6
     2018-05-07 18:11:01.402610+0800 003 GCD演示[86602:5136820] <NSThread: 0x6000004620c0>{number = 8, name = (null)} 5
     2018-05-07 18:11:01.402614+0800 003 GCD演示[86602:5136822] <NSThread: 0x6040002730c0>{number = 10, name = (null)} 7
     2018-05-07 18:11:01.402693+0800 003 GCD演示[86602:5136823] <NSThread: 0x600000461bc0>{number = 11, name = (null)} 8
     2018-05-07 18:11:01.402744+0800 003 GCD演示[86602:5136824] <NSThread: 0x604000273140>{number = 12, name = (null)} 9
    
     
   ---->  總結:沒什麼特別的 開啓一個 異步併發隊列
     2018-05-07 18:12:05.299154+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 0
     2018-05-07 18:12:05.302814+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 1
     2018-05-07 18:12:05.303830+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 2
     2018-05-07 18:12:05.304140+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 3
     2018-05-07 18:12:05.304293+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 4
     2018-05-07 18:12:05.304410+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 5
     2018-05-07 18:12:05.304639+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 6
     2018-05-07 18:12:05.304751+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 7
     2018-05-07 18:12:05.304915+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 8
     2018-05-07 18:12:05.305030+0800 003 GCD演示[86627:5138620] <NSThread: 0x604000075f40>{number = 1, name = main} 9
     2018-05-07 18:12:05.399105+0800 003 GCD演示[86627:5138620] Come here
    ----> 總結:沒什麼特別的 開啓一個 同步併發隊列
     */
}


//Mark:增長班同步任務
/*
 隊列調度多個任務以前,指定一個同步任務,讓全部的異步任務,等待同步任務執行完成,就是依賴關係
 同步任務就至關於一個鎖
 */
-(void)gcdDemo6
{
//    dispatch_queue_t loginQueue = dispatch_queue_create("CC_GCD", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t loginQueue = dispatch_queue_create("CC_GCD", NULL);
    
    void (^task)() = ^{
        //1.登陸
        
            NSLog(@"用戶登陸了 %@",[NSThread currentThread]);
        
        //2.支付
            sleep(1.3);
            NSLog(@"用戶支付了 %@",[NSThread currentThread]);
        
        //3.下載
    
            NSLog(@"用戶下載了 %@",[NSThread currentThread]);
/*
 2018-05-07 17:50:52.713088+0800 003 GCD演示[86418:5118592] 用戶登陸了 <NSThread: 0x60400027b1c0>{number = 3, name = (null)}
 2018-05-07 17:50:53.720881+0800 003 GCD演示[86418:5118592] 用戶支付了 <NSThread: 0x60400027b1c0>{number = 3, name = (null)}
 2018-05-07 17:50:53.721117+0800 003 GCD演示[86418:5118592] 用戶下載了 <NSThread: 0x60400027b1c0>{number = 3, name = (null)}
 總結:串行隊列/並行隊列 效果是同樣的
 */
    };
    
    
    dispatch_async(loginQueue, task);
    
    
    
    
}








//Mark 併發隊列,同步執行
/*
 會不會開闢線程?  順序執行嗎?   comeHere
  不會            順序          最後
 */
-(void)gcdDemo4
{
    //1.隊列 DISPATCH_QUEUE_CONCURRENT
    dispatch_queue_t q = dispatch_queue_create("CC_GCD", DISPATCH_QUEUE_CONCURRENT);

    
    //2.同步執行任務
    for (int i = 0;  i < 10; i++) {
        NSLog(@"%d------------- ",i);
        dispatch_sync(q, ^{
            if(i==3||i==5){
                
                sleep(2.0);
            }
            NSLog(@"%@,%d",[NSThread currentThread],i);
        });
        
    }
    
    NSLog(@"come here");
    /*
     2018-05-07 16:51:46.511757+0800 003 GCD演示[85767:5060291] 0-------------
     2018-05-07 16:51:46.518181+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},0
     2018-05-07 16:51:46.518790+0800 003 GCD演示[85767:5060291] 1-------------
     2018-05-07 16:51:46.519115+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},1
     2018-05-07 16:51:46.519493+0800 003 GCD演示[85767:5060291] 2-------------
     2018-05-07 16:51:46.521978+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},2
     2018-05-07 16:51:46.522231+0800 003 GCD演示[85767:5060291] 3-------------
     2018-05-07 16:51:48.523538+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},3
     2018-05-07 16:51:48.523810+0800 003 GCD演示[85767:5060291] 4-------------
     2018-05-07 16:51:48.524136+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},4
     2018-05-07 16:51:48.524444+0800 003 GCD演示[85767:5060291] 5-------------
     2018-05-07 16:51:50.526239+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},5
     2018-05-07 16:51:50.526510+0800 003 GCD演示[85767:5060291] 6-------------
     2018-05-07 16:51:50.526741+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},6
     2018-05-07 16:51:50.526947+0800 003 GCD演示[85767:5060291] 7-------------
     2018-05-07 16:51:50.527393+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},7
     2018-05-07 16:51:50.528577+0800 003 GCD演示[85767:5060291] 8-------------
     2018-05-07 16:51:50.528809+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},8
     2018-05-07 16:51:50.528969+0800 003 GCD演示[85767:5060291] 9-------------
     2018-05-07 16:51:50.529213+0800 003 GCD演示[85767:5060291] <NSThread: 0x600000071e40>{number = 1, name = main},9
     2018-05-07 16:51:50.529396+0800 003 GCD演示[85767:5060291] come here
     
     總結:因爲同步執行,即便爲異步隊列,也不會開闢新線程, 任務在主線程內執行.順序執行()
     因此說開不開線程,看是否異步,和這個隊列沒毛關係
     */
}






//Mark:併發隊列,異步執行
/*
 會不會開闢線程?  順序執行嗎?   comeHere
    會            不是         不肯定
 */
-(void)gcdDemo3
{
    //1.隊列 DISPATCH_QUEUE_CONCURRENT
    dispatch_queue_t q = dispatch_queue_create("CC_GCD", DISPATCH_QUEUE_CONCURRENT);
    
    
    //2.異步執行任務
    for (int i = 0;  i < 10; i++) {
        NSLog(@"%d------------- ",i);
        dispatch_async(q, ^{
            if(i== 3||i==4){
                
                sleep(1.5);
            }
            NSLog(@"%@,%d",[NSThread currentThread],i);
        });
        
    }
    
    NSLog(@"come here");
    
    /*
     2018-05-07 16:47:48.030652+0800 003 GCD演示[85712:5053945] 0-------------
     2018-05-07 16:47:48.030958+0800 003 GCD演示[85712:5053945] 1-------------
     2018-05-07 16:47:48.031097+0800 003 GCD演示[85712:5054078] <NSThread: 0x600000471a80>{number = 3, name = (null)},0
     2018-05-07 16:47:48.031267+0800 003 GCD演示[85712:5053945] 2-------------
     2018-05-07 16:47:48.031354+0800 003 GCD演示[85712:5054079] <NSThread: 0x600000472100>{number = 4, name = (null)},1
     2018-05-07 16:47:48.031461+0800 003 GCD演示[85712:5053945] 3-------------
     2018-05-07 16:47:48.031501+0800 003 GCD演示[85712:5054078] <NSThread: 0x600000471a80>{number = 3, name = (null)},2
     2018-05-07 16:47:48.031620+0800 003 GCD演示[85712:5053945] 4-------------
     2018-05-07 16:47:48.032760+0800 003 GCD演示[85712:5053945] 5-------------
     2018-05-07 16:47:48.033992+0800 003 GCD演示[85712:5053945] 6-------------
     2018-05-07 16:47:48.034114+0800 003 GCD演示[85712:5054077] <NSThread: 0x600000471ec0>{number = 5, name = (null)},5
     2018-05-07 16:47:48.035160+0800 003 GCD演示[85712:5053945] 7-------------
     2018-05-07 16:47:48.035318+0800 003 GCD演示[85712:5054075] <NSThread: 0x604000262d00>{number = 6, name = (null)},6
     2018-05-07 16:47:48.037172+0800 003 GCD演示[85712:5053945] 8-------------
     2018-05-07 16:47:48.037215+0800 003 GCD演示[85712:5054077] <NSThread: 0x600000471ec0>{number = 5, name = (null)},7
     2018-05-07 16:47:48.037922+0800 003 GCD演示[85712:5053945] 9-------------
     2018-05-07 16:47:48.037965+0800 003 GCD演示[85712:5054075] <NSThread: 0x604000262d00>{number = 6, name = (null)},8
     2018-05-07 16:47:48.038402+0800 003 GCD演示[85712:5053945] come here
     2018-05-07 16:47:48.038440+0800 003 GCD演示[85712:5054077] <NSThread: 0x600000471ec0>{number = 5, name = (null)},9
     2018-05-07 16:47:49.034294+0800 003 GCD演示[85712:5054079] <NSThread: 0x600000472100>{number = 4, name = (null)},3
     2018-05-07 16:47:49.034364+0800 003 GCD演示[85712:5054078] <NSThread: 0x600000471a80>{number = 3, name = (null)},4
     
     總結:並行隊列/異步執行
     是否開闢線程:會
     開闢線程數:不必定/cpu調度
     執行順序:不必定,看線程內任務是否耗時
     */
    
}






//Mark:串行隊列,異步執行
/*
 會不會開闢線程?  順序執行嗎?
    會              會
 */
-(void)gcdDemo2
{
    
    //1.隊列 -- 串行 DISPATCH_QUEUE_SERIAL 串行 等價於NULL
    dispatch_queue_t q = dispatch_queue_create("CC_GCD", NULL);
    
    
    //2.異步執行任務
    for (int i = 0;  i < 10; i++) {
        NSLog(@"%d------------- ",i);
        dispatch_async(q, ^{
            NSLog(@"%@,%d",[NSThread currentThread],i);
        });
        
    }
    
    NSLog(@"come here");
    /*
     2018-05-07 16:42:14.945286+0800 003 GCD演示[85624:5044961] 0-------------
     2018-05-07 16:42:14.945568+0800 003 GCD演示[85624:5044961] 1-------------
     2018-05-07 16:42:14.945730+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},0
     2018-05-07 16:42:14.946207+0800 003 GCD演示[85624:5044961] 2-------------
     2018-05-07 16:42:14.946371+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},1
     2018-05-07 16:42:14.946510+0800 003 GCD演示[85624:5044961] 3-------------
     2018-05-07 16:42:14.946642+0800 003 GCD演示[85624:5044961] 4-------------
     2018-05-07 16:42:14.946673+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},2
     2018-05-07 16:42:14.947064+0800 003 GCD演示[85624:5044961] 5-------------
     2018-05-07 16:42:14.948015+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},3
     2018-05-07 16:42:14.948690+0800 003 GCD演示[85624:5044961] 6-------------
     2018-05-07 16:42:14.949690+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},4
     2018-05-07 16:42:14.950768+0800 003 GCD演示[85624:5044961] 7-------------
     2018-05-07 16:42:14.951341+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},5
     2018-05-07 16:42:14.951730+0800 003 GCD演示[85624:5044961] 8-------------
     2018-05-07 16:42:14.952629+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},6
     2018-05-07 16:42:14.953559+0800 003 GCD演示[85624:5044961] 9-------------
     2018-05-07 16:42:14.954518+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},7
     2018-05-07 16:42:14.955275+0800 003 GCD演示[85624:5044961] come here
     2018-05-07 16:42:14.955690+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},8
     2018-05-07 16:42:14.956065+0800 003 GCD演示[85624:5045326] <NSThread: 0x60400026f300>{number = 3, name = (null)},9
     
     總結:異步串行隊列,會開闢子線程,而後子線程內任務依次執行(廢話 一個線程內執行的 能不順序執行麼)
     come here 雖然在主線程,可是不見得先打印,也許子線程中任務執行更快
     */
    
}






//Mark:串行隊列,同步執行
/*
  會不會開闢線程?  順序執行嗎?
    不會            會
 */
-(void)gcdDemo1
{
    
    //1.隊列 -- 串行 DISPATCH_QUEUE_SERIAL 串行 等價於NULL
    dispatch_queue_t q = dispatch_queue_create("CC_GCD", NULL);
    
    
    //2.同步執行任務
    for (int i = 0;  i < 10; i++) {
        dispatch_sync(q, ^{
            NSLog(@"%@,%d",[NSThread currentThread],i);
        });
   
    }
    
   /*
    2018-05-07 16:40:25.967160+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},0
    2018-05-07 16:40:25.969158+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},1
    2018-05-07 16:40:25.987708+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},2
    2018-05-07 16:40:25.988432+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},3
    2018-05-07 16:40:25.989809+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},4
    2018-05-07 16:40:25.990379+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},5
    2018-05-07 16:40:25.990513+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},6
    2018-05-07 16:40:25.990759+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},7
    2018-05-07 16:40:25.990905+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},8
    2018-05-07 16:40:25.991057+0800 003 GCD演示[85590:5041711] <NSThread: 0x6000002600c0>{number = 1, name = main},9
    
    總結:沒啥好說的 同步串行隊列 ,主線線程內依次執行
    */
    
}


//線程池???? !!!


//全局隊列本質是一個 併發隊列
/*gcd  執行子線程的執行順序

 方案1:
 實現一個異步串行隊列
 異步開啓子線程,串行隊列順序執行 三個任務
 
 方案2:將三個任務封裝成一個block總體
 開啓異步隊列/串行,並行隊列都行,由於是個總體
 

*/


@end
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息