线程中

同步任务是串行队列,也就是按顺序执行。

同步任务:不会开辟新的线程,它是在当前线程执行的。

dispatch 调度   GCD里面的函数都是以dispatch开头的。

同步任务  步骤:

1.创建一个串行队列    参数:1.队列标签   2.队列属性   DISPATCH_QUEUE_SERIAL它是个宏,是个NULL

dispatch_queue_t queue = dispatch_queue_create("ZPqueue",DISPATCH_QUEUE_SERIAL);

2.同步执行任务  一般只要使用同步执行,串行队列对添加的同步任务,就会马上执行。

dispatch_sync(queue,^{NSLog(@"%@",[NSThread currentThread]);});

异步执行:肯定会开新线程,而且只会开一个线程,所有任务都会在这个新的线程里面执行。

异步任务 步骤:

dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_SERIAL);

2.同步执行任务  一般只要使用同步执行,串行队列对添加的同步任务,就会马上执行。

dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});

并发队列:会开多个线程,并且它要开多少个线程是我们无法控制的。

dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_CONCURRENT);

2.同步执行任务  一般只要使用同步执行,串行队列对添加的同步任务,就会马上执行。

dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});

总结:

核心概念:

任务:block

队列:把任务放到队列里面,队列遵循先进先出原则。

串行队列:按顺序执行,当前任务执行完毕才会执行下一个目标任务。

并发队列:同时执行多个任务(可以同时去除多个任务,只要有线程)。

串行队列同步执行:不开线程,在原来的线程里面一个一个的按顺序执行。

串行队列异步执行:开一条线程,在新的线程里面按顺序执行。

并发队列异步执行:开多个线程,并发执行(不一定是一个一个的执行,可能会是多个一起执行)。

并发队列同步执行:不开线程,在原来的线程里面一个一个按顺序执行。

阶段性总结:

1.开不开线程,由执行任务方法决定,同步不开线程,异步肯定开线程。

2.开多少线程,由队列决定,串行最多开一个线程,并发可以开多个线程。具体开多少个由GCD底层决定,程序员不能控制。

**主队列**

// 主队列  :专门负责在主线程上调度任务,不会再子线程调度任务,在主队列不允许开新线程

// 主队列:不允许开新线程

// 异步执行:会开新线程,在新线程执行。

// 结果:不卡线程,只能在主线程上面运行,顺序执行。

步骤:

获得主队列   --- 程序一旦启动至少有一个主线程--->一开始就会创建主队列

-(void)test1{

   // 1.获得主队列 

dispatch_queue_t queue = dispatch_get_main_queue();

  // 2.异步执行任务

  for(int i = 0; i < 10; i++)

  {

   NSLog(@"调度前-----");

   // 异步:把任务放到主队列里,但是不需要马上执行。它跟for循环没有关系,test1执行完毕之后他会全部执行完成。

  dispatch_async(queue,^{

    NSLog(@"%@ %d",[NSThread currnetThread],i);

    });

   }

    NSLog(@"完成---");  // 在这里执行完毕之后会执行主队列的东西。

}

注意:异步执行:异步任务不需要马上执行,只是先把任务放到主队列,等线程有空再去执行,就是等到test1执行结束了,主线程有空闲了就去执行

**同步任务**

-(void)test2{

   // 1.获得主队列 

dispatch_queue_t queue = dispatch_get_main_queue();

  // 2.异步执行任务

  for(int i = 0; i < 10; i++)

  {

   NSLog(@"调度前-----");

   // 异步:把任务放到主队列里,但是不需要马上执行。它跟for循环没有关系,test1执行完毕之后他会全部执行完成。

  dispatch_sync(queue,^{

    NSLog(@"%@ %d",[NSThread currnetThread],i);

    });

   }

    NSLog(@"完成---");  // 在这里执行完毕之后会执行主队列的东西。

}

注意:这个任务是执行不下去的,因为同步任务需要马上执行,但是主线程上面正在执行test2,所以需要等待test2执行完毕之后才能执行同步任务,但是test2在等待这个同步任务执行结束,这样就造成主线程阻塞,产生死锁。谁也没有办法往下执行。

并发队列:

-(void)test3

{

  // 例子:有一个小说网站,必须登陆才能下载小说

  // 分析:上面是有三个任务---1,用户登录 2,下载小说a  3,下载小说b  

// 所以这个小说网站是通过同步执行。

  dispatch_queue_t queue = dispatch_queue_create("cz",DISPATCH_QUEUE_CONCURRENT);

  dispatch_sync(queue,^{

    NSLog(@"用户登录%@",[NSThread currentThread]);

  });

}

**全局队列**

/**

全局队列跟并发队列的区别

1.全局队列:没有名称,并发队列有名称

2.全局队列,是供所有的应用程序共享

3.再mrc开发,并发队列创建完成,需要释放;全局队列不需要管理。

*/

-(void)test4

{

  // 获取全局队列

  // DISPATCH_QUEUE_PRIORITY_HIGH 2 高级优先级  IOS7.0

  // DISPATCH_QUEUE_PRIORITY_DEFAULT 0  默认优先级 IOS7.0

  // DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级 IOS7.0

  // DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台优先级  IOS7.0

  // IOS8.0 QOS_CLASS_DEFAULT 0 ;

// 参数:1.优先级 (一般写 0  可以适配ios7盒ios8)2.预留参数(也是直接写0)

  dispatch_queue_t  queue = dispatch_get_global_queue  queue(0,0);

  // 添加异步任务

dispatch_async(queue,^{

    NSLog(@"用户登录%@",[NSThread currentThread]);

  });

}

******************************************************************

**      *  全局并行队列    * 手动创建串行队列   *  主队列      *

******************************************************************

**同步并行  *   没有开启新线程    * 没有开启新线程    *  死锁         *

      *     串行执行任务       * 串行执行任务                *

**异步    *   有开启新线程     * 有开启新线程     *  没有开启新线程  *

      *     并行执行任务     * 串行执行任务     *  串行执行任务     *

******************************************************************

队列的选择:

串行队列异步执行

--开一条线程,顺序执行。

--效率不高,执行的比较慢,资源占用小->省电

使用场合:

一般网络连接(3g 4g)对性能要求不会很高

并发队列异步执行

--开启多条线程,并发执行

--效率高,执行快。资源占用大->费电。

使用场合:

-网络wifi   或者需要很快响应,要求用户体验非常流畅。

-对任务执行顺序没有要求

同步任务:一般只会在并发队列,需要阻塞后续任务,必须等待同步任务执行完毕,再去执行其他任务。“依赖”关系。

从子线程回到主线程

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

  // 执行耗时的异步操作。。。。

  dispatch_async(dispatch_get_main_queue(),^{

   // 回到主线程

  });

});

同步sync 异步async的更多相关文章

  1. 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

    1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:    ...

  2. 同步与异步 & 阻塞与非阻塞

    在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 一.同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用 ...

  3. socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就 ...

  4. socket阻塞与非阻塞,同步与异步

    socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...

  5. Python番外之 阻塞非阻塞,同步与异步,i/o模型

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就 ...

  6. 聊聊阻塞与非阻塞、同步与异步、I/O模型

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步: 所谓同步,就是在c端 ...

  7. socket阻塞与非阻塞,同步与异步、I/O模型

    socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所 ...

  8. 阻塞与非阻塞、同步与异步、I/O模型

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步: 所谓同步,就是在c端 ...

  9. PHP-Socket-阻塞与非阻塞,同步与异步概念的理解

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步,就是在发出一个功能调用时,在没 ...

随机推荐

  1. [hgoi#2019/3/10]赛后总结

    关于本次hg模拟赛,题目来源于CF1110. t1-无意义运算符(meaning) 题目描述 最大公约数和位运算之间有共同点吗?是时候来研究一下了. 给定一个正整数a,请找到一个闭区间[1,a-1] ...

  2. Hadoop HDFS命令

    hadoop fs -mkdir  创建HDFS目录 # hadoop fs -mkdir /data Hadoop fs -ls  列出HDFS目录 # hadoop fs -ls /data ha ...

  3. ThinkPHP5 隐藏index.php问题

    隐藏index.php 可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则. 以Apache为例,需要在入口文件的同级添加.htaccess文件(官方默认自带了 ...

  4. 使用fiddler模拟http请求

    概述  与httpwath相比,fiddler能模拟http请求.能断点调试.http分析统计吸引了我,使用之后感觉这个工具非常不错,这篇文章只单介绍一下fiddler工作原理,简单介绍一下它的重要功 ...

  5. [POI2012]BON-Vouchers----你敢模拟吗?

    链接:https://www.luogu.org/problemnew/show/P3536 题意: 定义n个数为幸运数字,一共有n批人,设第i批人有x个,则它们会依次取走余下的x的倍数中最小的x个, ...

  6. centos7配置本地yum源 使用安装镜像安装软件

    1. 在cdrom挂载安装镜像.(物理机则插入光盘,虚拟机则在CD/DVD中选择iso镜像.如果虚拟机mount时提示找不到则在选择iso镜像上方勾选“已连接”和“启动时连接”,或者点击 虚拟机下方状 ...

  7. JAVA类中获取项目路径

    在java web项目中获取项目的src/main/resource下的文件路径 当前类名.class.getClassLoader().getResource("/").getP ...

  8. 走进JVM之一 自己编译openjdk源码

    想要深入了解JVM,就必须了解其实现机制.了解JVM实现的最好方法便是自己动手编译JDK.好了,让我们开始吧! 1.  准备工作 获取OpenJDK源码 本次编译选择的是OpenJDK7u,官方源码包 ...

  9. poj 2785(折半枚举+二分搜索)

    传送门:Problem 2785 题意: 给定 n 行数,每行都有 4 个数A,B,C,D. 要从每列中各抽取出一个数,问使四个数的和为0的所有方案数. 相同数字不同位置当作不同数字对待. 题解: 如 ...

  10. Linux系统下yum镜像源环境部署记录

    之前介绍了Linux环境下本地yum源配置方法,不过这个是最简单最基础的配置,在yum安装的时候可能有些软件包不够齐全,下面说下完整yun镜像源系统环境部署记录(yum源更新脚本下载地址:https: ...