GCD,用同步/异步函数,创建并发/串行队列

Posted on 2016-07-16 21:00  柠檬片  阅读(311)  评论(0)    收藏  举报
  • 队列 

  第一个参数:C语言字符串,标签

     第二个参数:

     DISPATCH_QUEUE_CONCURRENT:并发队列

     DISPATCH_QUEUE_SERIAL:串行队列

dispatch_queue_t queue =  dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_CONCURRENT);//并发队列

dispatch_queue_t queue =  dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_SERIAL);//串行队列

 

  •   //获取全局并发队列(GCD默认已经提供了全局的并发队列,供整个应用使用,可以无需手动创建)  

        /*

           第一个参数:队列的优先级:

          #define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
          #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
          #define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
          #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台

           第二个参数:永远传0

         */

      dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

 

  • 使用dispatch_get_main_queue()获得主队列

      dispatch_queue_t queue = dispatch_get_main_queue();

 

 

并发队列

手动创建的串行队列

主队列
同步(sync)
没有开启新线程
串行执行任务
没有开启新线程
串行执行任务
没有开启新线程
串行执行任务

异步(async)

有开启新线程
并发执行任务
有开启新线程
串行执行任务
没有开启新线程
串行执行任务

 

  1 //同步函数+主队列:死锁
  2 -(void)syncMain
  3 {
  4     NSLog(@"----");
  5     //1.获得主队列
  6     dispatch_queue_t queue =  dispatch_get_main_queue();
  7     
  8     //2.同步函数
  9     dispatch_sync(queue, ^{
 10         NSLog(@"---download1---%@",[NSThread currentThread]);
 11     });
 12     
 13     dispatch_sync(queue, ^{
 14         NSLog(@"---download2---%@",[NSThread currentThread]);
 15     });
 16     
 17     dispatch_sync(queue, ^{
 18         NSLog(@"---download3---%@",[NSThread currentThread]);
 19     });
 20     dispatch_sync(queue, ^{
 21         NSLog(@"---download4---%@",[NSThread currentThread]);
 22     });
 23     
 24 }
 25 
 26 
 27 //异步函数+主队列:不会开线程,任务串行执行
 28 -(void)asyncMain
 29 {
 30     //1.获得主队列
 31     dispatch_queue_t queue =  dispatch_get_main_queue();
 32     
 33     //2.异步函数
 34     dispatch_async(queue, ^{
 35         NSLog(@"---download1---%@",[NSThread currentThread]);
 36     });
 37     
 38     dispatch_async(queue, ^{
 39         NSLog(@"---download2---%@",[NSThread currentThread]);
 40     });
 41     
 42     dispatch_async(queue, ^{
 43         NSLog(@"---download3---%@",[NSThread currentThread]);
 44     });
 45     dispatch_async(queue, ^{
 46         NSLog(@"---download4---%@",[NSThread currentThread]);
 47     });
 48 
 49 }
 50 
 51 //同步函数+串行队列:不会开线程,任务串行执行
 52 -(void)syncSerial
 53 {
 54     
 55     //创建串行队列
 56     /*
 57      第一个参数:C语言字符串,标签
 58      第二个参数:
 59      DISPATCH_QUEUE_CONCURRENT:并发队列
 60      DISPATCH_QUEUE_SERIAL:串行队列
 61      */
 62     dispatch_queue_t queue =  dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_SERIAL);
 63     
 64     dispatch_sync(queue, ^{
 65         NSLog(@"---download1---%@",[NSThread currentThread]);
 66     });
 67     
 68     dispatch_sync(queue, ^{
 69         NSLog(@"---download2---%@",[NSThread currentThread]);
 70     });
 71     
 72     dispatch_sync(queue, ^{
 73         NSLog(@"---download3---%@",[NSThread currentThread]);
 74     });
 75     dispatch_sync(queue, ^{
 76         NSLog(@"---download4---%@",[NSThread currentThread]);
 77     });
 78 }
 79 //同步函数+并发队列:不会开线程,任务串行执行
 80 -(void)syncConcurrent
 81 {
 82     dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
 83     
 84     NSLog(@"--syncConcurrent--start-");
 85     
 86     dispatch_sync(queue, ^{
 87         NSLog(@"---download1---%@",[NSThread currentThread]);
 88     });
 89     
 90     dispatch_sync(queue, ^{
 91         NSLog(@"---download2---%@",[NSThread currentThread]);
 92     });
 93     
 94     dispatch_sync(queue, ^{
 95         NSLog(@"---download3---%@",[NSThread currentThread]);
 96     });
 97     dispatch_sync(queue, ^{
 98         NSLog(@"---download4---%@",[NSThread currentThread]);
 99     });
100     
101       NSLog(@"--syncConcurrent--end-");
102 }
103 //异步函数+串行队列:会开启一条线程,任务串行执行
104 -(void)asyncSerial
105 {
106     //创建串行队列
107     /*
108      第一个参数:C语言字符串,标签
109      第二个参数:
110      DISPATCH_QUEUE_CONCURRENT:并发队列
111      DISPATCH_QUEUE_SERIAL:串行队列
112      */
113     dispatch_queue_t queue =  dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_SERIAL);
114     
115     dispatch_async(queue, ^{
116         NSLog(@"---download1---%@",[NSThread currentThread]);
117     });
118     
119     dispatch_async(queue, ^{
120         NSLog(@"---download2---%@",[NSThread currentThread]);
121     });
122     
123     dispatch_async(queue, ^{
124         NSLog(@"---download3---%@",[NSThread currentThread]);
125     });
126     dispatch_async(queue, ^{
127         NSLog(@"---download4---%@",[NSThread currentThread]);
128     });
129 }
130 //异步函数+并发队列:会开启新的线程,并发执行
131 -(void)asyncCONCURRENT
132 {
133     //创建并发队列
134     /*
135      第一个参数:C语言字符串,标签
136      第二个参数:
137      DISPATCH_QUEUE_CONCURRENT:并发队列
138      DISPATCH_QUEUE_SERIAL:串行队列
139      */
140 //    dispatch_queue_t queue =  dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_CONCURRENT);
141     NSLog(@"--asyncCONCURRENT--start-");
142     //获得全局并发队列
143     /*
144      第一个参数:队列的优先级DISPATCH_QUEUE_PRIORITY_DEFAULT
145      第二个参数:永远传0
146      */
147     dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
148     //异步函数
149     /*
150      第一个参数:队列
151      第二个参数:block,在里面封装任务
152      */
153     dispatch_async(queue, ^{
154         NSLog(@"---download1---%@",[NSThread currentThread]);
155     });
156     
157     dispatch_async(queue, ^{
158         NSLog(@"---download2---%@",[NSThread currentThread]);
159     });
160     
161     dispatch_async(queue, ^{
162         NSLog(@"---download3---%@",[NSThread currentThread]);
163     });
164     dispatch_async(queue, ^{
165         NSLog(@"---download4---%@",[NSThread currentThread]);
166     });
167     
168       NSLog(@"--asyncCONCURRENT--end-");
169 }
示例