• 队列

  第一个参数: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)

有开启新线程
并发执行任务
有开启新线程
串行执行任务
没有开启新线程
串行执行任务
 //同步函数+主队列:死锁
-(void)syncMain
{
NSLog(@"----");
//1.获得主队列
dispatch_queue_t queue = dispatch_get_main_queue(); //2.同步函数
dispatch_sync(queue, ^{
NSLog(@"---download1---%@",[NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"---download2---%@",[NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"---download3---%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"---download4---%@",[NSThread currentThread]);
}); } //异步函数+主队列:不会开线程,任务串行执行
-(void)asyncMain
{
//1.获得主队列
dispatch_queue_t queue = dispatch_get_main_queue(); //2.异步函数
dispatch_async(queue, ^{
NSLog(@"---download1---%@",[NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"---download2---%@",[NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"---download3---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"---download4---%@",[NSThread currentThread]);
}); } //同步函数+串行队列:不会开线程,任务串行执行
-(void)syncSerial
{ //创建串行队列
/*
第一个参数:C语言字符串,标签
第二个参数:
DISPATCH_QUEUE_CONCURRENT:并发队列
DISPATCH_QUEUE_SERIAL:串行队列
*/
dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_SERIAL); dispatch_sync(queue, ^{
NSLog(@"---download1---%@",[NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"---download2---%@",[NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"---download3---%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"---download4---%@",[NSThread currentThread]);
});
}
//同步函数+并发队列:不会开线程,任务串行执行
-(void)syncConcurrent
{
dispatch_queue_t queue = dispatch_get_global_queue(, ); NSLog(@"--syncConcurrent--start-"); dispatch_sync(queue, ^{
NSLog(@"---download1---%@",[NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"---download2---%@",[NSThread currentThread]);
}); dispatch_sync(queue, ^{
NSLog(@"---download3---%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"---download4---%@",[NSThread currentThread]);
}); NSLog(@"--syncConcurrent--end-");
}
//异步函数+串行队列:会开启一条线程,任务串行执行
-(void)asyncSerial
{
//创建串行队列
/*
第一个参数:C语言字符串,标签
第二个参数:
DISPATCH_QUEUE_CONCURRENT:并发队列
DISPATCH_QUEUE_SERIAL:串行队列
*/
dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{
NSLog(@"---download1---%@",[NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"---download2---%@",[NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"---download3---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"---download4---%@",[NSThread currentThread]);
});
}
//异步函数+并发队列:会开启新的线程,并发执行
-(void)asyncCONCURRENT
{
//创建并发队列
/*
第一个参数:C语言字符串,标签
第二个参数:
DISPATCH_QUEUE_CONCURRENT:并发队列
DISPATCH_QUEUE_SERIAL:串行队列
*/
// dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"--asyncCONCURRENT--start-");
//获得全局并发队列
/*
第一个参数:队列的优先级DISPATCH_QUEUE_PRIORITY_DEFAULT
第二个参数:永远传0
*/
dispatch_queue_t queue = dispatch_get_global_queue(, );
//异步函数
/*
第一个参数:队列
第二个参数:block,在里面封装任务
*/
dispatch_async(queue, ^{
NSLog(@"---download1---%@",[NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"---download2---%@",[NSThread currentThread]);
}); dispatch_async(queue, ^{
NSLog(@"---download3---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"---download4---%@",[NSThread currentThread]);
}); NSLog(@"--asyncCONCURRENT--end-");
}

示例

GCD,用同步/异步函数,创建并发/串行队列的更多相关文章

  1. IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...

  2. ios多线程操作(五)—— GCD串行队列与并发队列

          GCD的队列能够分为2大类型,分别为串行队列和并发队列      串行队列(Serial Dispatch Queue):      一次仅仅调度一个任务,队列中的任务一个接着一个地运行( ...

  3. OC 线程操作 - GCD使用 -同步函数,异步函数,串行队列,并发队列

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // GCD 开几条线程并不是我们 ...

  4. GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...

  5. 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    (1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...

  6. iOS:对GCD中 同步、异步、并行、串行的见解

    1.GCD-同步执行多线程时          GCD中不管向什么类型的队列加同步任务,实际上都会加到当前线程中(一般为主线程). 2.GCD-异步执行多线程时          GCD中不管向什么类 ...

  7. iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group

    同步,指代码在同一个线程运行 异步,代码在另一个线程运行 串行队列,提交到该队列的block会顺序执行 并行队列,提交到该队列的block会并发执行 如果想等某一队列中所有block都执行完了在执行一 ...

  8. iOS:转载:同步、异步、并行、串行的详解

    理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念 2014年11月21 ...

  9. ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)

    现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序 ...

随机推荐

  1. Network-POJ3694并查集+LCA

    Network Time Limit: 5000MS   Memory Limit: 65536K       Description A network administrator manages ...

  2. python学习之while语句

    while循环 1.简单的while循环while True: ")#这是一个简单的while循环,当等于True时会一直打印1 2.while执行多少次后退出 coun=0while Tr ...

  3. 使用servlet实现用户注册功能

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. 【转】对硬盘进行分区时,GPT和MBR区别。

    在Windows 8或8.1中设置新磁盘时,系统会询问你是想要使用MBR还是GPT分区.GPT是一种新的标准,并在逐渐取代MBR. GPT带来了很多新特性,但MBR仍然拥有最好的兼容性.GPT并不是W ...

  5. EVA资料

    [史上最全EVA资料+原画+画集+设定集][共2266P=3.56GB] <ignore_js_op> <ignore_js_op> <ignore_js_op>  ...

  6. jquery总结01-基本概念和选择器

    dom元素和jquery元素的区别 dom元素支持dom元素自带的属性和方法,jquery元素支持jquery元素自带的属性和方法 dom                  var div = doc ...

  7. 《BI项目笔记》挑选产出分析Cube

    数据源设置: 数据处理逻辑: --I_GBGradeID SELECT * FROM T_NPick_PkgMov WHERE I_GBGradeID NOT IN ( SELECT I_GBGrad ...

  8. Android Studio build dex jar

    Gradle配置 Build配置文件gradle.build中添加如下task task clearJar(type: Delete) { delete 'build/outputs/mylib.ja ...

  9. c#中对rgb的使用

    今天发现c#中没有和vb类似的函数RGB(), 后来发现可以通过Color类来实现 从R,G,B的值可以得到一个Color,如: Color c = Color.FromArgb(255,0,0); ...

  10. struts2学习:配置篇之namespace

    把namespace单独拉出来讲一方面是因为它实际上不是一个element,而只是一个attribute,前面已经说了,它是package的一个attribute:另外一方面是因为这个属性是我接触St ...