主队列,全局队列,并发队列关系比较

原创 2015年11月17日 15:46:37

多线程(2) - ios关于线程调度的三种方式之GCD

GCD(链接:http://blog.csdn.net/linzhiji/article/details/6863972)

一 概念和理解

    Grand Central Dispatch(多线程的优化技术)GCD

    是一套底层API,基于C语言开发的多线程机制,提供了新的模式编写并发执行的程序。

    特点:

        1.允许将一个程序切分为多个单一任务,然后提交到工作队列中并发或者串行地执行

        2.为多核的并行运算提出了解决方案,自动合理的利用CPU内核(比如双核,四核)

        3.自动的管理线程的生命周期(创建线程、调度任务、销毁线程),完全不需要我们管理,只需要告诉它任务是什么就行

        4.配合Block,使得使用起来更加方便灵活

 

    2.什么是Queue队列?

        GCD使用了队列的概念,解决了NSThread难于管理的问题,队列实际上就是数组的概念,通常我们把要执行的任务放到队列中管理

    特点:

        1.按顺序执行,先进先出

        2.可以管理多线程,管理并发的任务,设置主线程

        3.GCD的队列是任务的队列,而不是线程的队列

 

    3.什么是任务?

        任务即操作:你想要干什么,说白了就是一段代码,在GCD中,任务就是一个block

        任务的两种执行方式:

        同步执行:只要是同步任务,都会在当前的线程执行,不会另开线程

        异步执行:只要是异步任务,都会开启新线程,在开启的线程中执行

    4.什么是串行队列?

        依次完成每一任务

    5.什么是并行队列?

        好像所有的任务都是在同一时间执行的

    6.都有哪些队列?

        Main Queue(主队列,串行);全局队列(Global Queue);自己创建的队列(Queue

        从上面的概念以及gcd所解决的问题来看,使用GCD的时候就要开始转变观念了。现在我们需要考虑的只是任务,队列,队列间同步或异步的关系了。而不是考虑怎么开辟线程,怎么管理线程,所有关于线程的东西,我们都不需要考虑。整个程序完全就是由队列来自动管理了。首先,整个程序是由全局队列来管理,然后UI的刷新是由mainqueue管理,我们可以将我们的任务放到我们创建的队列中去,也可以放在主队列中,也可以放在全局队列中。

        举个例子:现在我们要从网络上下载一张图片,可以直接将任务放到主队列中去执行,但是这样会出项一个问题,因为主队列是处理和UI相关的任务的,所以在创建(或者刷新)UI的时候,界面就会卡住,直到这张图片现在完毕。所以一般的做法是首先获取全局队列,然后在全局队列中植入下载图片的代码,在下完成后,将图片刷回UI,也就是主队列。至于图片什么时候下载完毕,怎么开辟线程,我们都不需要管。需要做的就是处理代码逻辑就行。以下是使用GCD下载图片的代码

   + (void)SL_setImageView:(UIImageView *)imageView url:(NSString *)url

            {

                //对应全局队列开启一个异步任务

                dispatch_async(dispatch_get_global_queue(0, 0), ^{

                    //下载图片数据

                    NSURL *imageURL = [NSURL URLWithString:url];

                    NSData *data = [NSData dataWithContentsOfURL:imageURL];

                    UIImage *image = [UIImage imageWithData:data];

                    //刷新ImageView  (回调主线程)

                    dispatch_async(dispatch_get_main_queue(), ^{

                        imageView.image = image;

                    });

                });

            } 

关于容易混淆概念的区分:

 1, 同步,异步,串行,并发

        同步和异步代表会不会开辟新的线程。串行和并发代表任务执行的方式。

        同步串行和同步并发,任务执行的方式是一样的。没有区别,因为没有开辟新的线程,所有的任务都是在一条线程里面执行。

        异步串行和异步并发,任务执行的方式是有区别的,异步串行会开辟一条新的线程,队列中所有任务按照添加的顺序一个一个执行,异步并发会开辟多条线程,至于具体开辟多少条线程,是由系统决定的,但是所有的任务好像就是同时执行的一样。

        

         

        开辟队列的方法:

        dispatch_queue_t myQueue = dispatch_queue_create("MyQueue", NULL);

                /**

                    参数1:标签,用于区分队列

                    参数2:队列的类型,表示这个队列是串行队列还是并发队列NUll表示串行队列,

                DISPATCH_QUEUE_CONCURRENT表示并发队列

                    */

        执行队列的方法

               异步执行

        dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

               同步执行

               dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)


二,主队列

    主队列:专门负责调度主线程度的任务,没有办法开辟新的线程。所以,在主队列下的任务不管是异步任务还是同步任务都不会开辟线程,任务只会在主线程顺序执行。

    主队列异步任务:现将任务放在主队列中,但是不是马上执行,等到主队列中的其它所有除我们使用代码添加到主队列的任务的任务都执行完毕之后才会执行我们使用代码添加的任务。 

    主队列同步任务:容易阻塞主线程,所以不要这样写。原因:我们自己代码任务需要马上执行,但是主线程正在执行代码任务的方法体,因此代码任务就必须等待,而主线程又在等待代码任务的完成好去完成下面的任务,因此就形成了相互等待。整个主线程就被阻塞了。


三,全局队列

    全局队列:本质是一个并发队列,由系统提供,方便编程,可以不用创建就直接使用。

    获取全局队列的方法:dispatch_get_global_queue(long indentifier.unsigned long flags)

    /**

    参数说明:

        参数1:代表该任务的优先级,默认写0就行,不要使用系统提供的枚举类型,因为ios7和ios8的枚举数值不一样,使用数字可以通用。

    参数2:苹果保留关键字,一般也写0

    */

    全局队列和并发队列的区别:

    1,全局队列没有名字,但是并发队列有名字。有名字可以便于查看系统日志

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

    3,在mrc的时候,全局队列不用手动释放,但是并发队列需要。

    

    


版权声明:本文为博主原创文章,需要转载的,请先联系我

iOS GCD/主队列/并行队列/全局队列/串行队列/同步任务/异步任务区别 含代码

http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%83%AD/32951.shtml 进程:正在进行中的程序被称为进程,负责程序运行...
  • jeffasd
  • jeffasd
  • 2016年05月27日 22:00
  • 2027

ios多线程操作(六)—— GCD全局队列与主队列

GCD默认已经提供了全局的并发队列供整个应用使用,所以可以不用手动创建。       创建全局队列的函数为 dispatch_queue_t q = dispatch_get_global_queue...
  • u011058732
  • u011058732
  • 2015年03月20日 21:07
  • 4182

CGD全局并发队列和主队列的应用

* 1. 主队列特点 :主队列中的任务,只有主线程空闲的时候才会被调度 2. 主队列又叫全局串行队列,程序启动的时候就创建了主队列,在使用的时候不需要创建,直接GET. 2. 主队列中的任...
  • c386890506
  • c386890506
  • 2016年04月22日 11:37
  • 369

GCD之主队列、全局并发队列、以及同步任务的执行

主队列:专门负责在主线程上调度任务,不会在子线程上调度任务,在主队列不允许开新线程。 主队列的特点:只在主线程运行,不开新线程。 异步执行:会开新线程,在新线程执行。 异步执行特点:不需要马上执行。 ...
  • u013087513
  • u013087513
  • 2015年10月21日 19:29
  • 1652

GCD主队列死锁和全局队列

每一个应用程序只有一个主线程即只有一个主队列 在线程间通信中一定会使用,文章链接 http://blog.csdn.net/sinat_20559947/article/details/5...
  • sinat_20559947
  • sinat_20559947
  • 2016年09月21日 16:24
  • 291

全局队列/主队列/

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

GCD介绍。串行队列、并行队列、全局队列、主队列、同步任务、异步任务

GCD的基本思想就是将操作(任务)放在队列中去执行 队列负责调度任务执行所在的线程以及具体的执行时间 队列的特点是先进先出,新添加至队列的操作(任务)都会排在队尾 GCD...
  • u013089311
  • u013089311
  • 2015年07月31日 16:01
  • 1651

ios-day19-02(GCD介绍。串行队列、并行队列、全局队列、主队列、同步任务、异步任务)

// // JLViewController.m // 01-GCD // // Created by XinYou on 15-4-3. // Copyright (c) 2015...
  • liu537192
  • liu537192
  • 2015年04月03日 22:50
  • 2945

GCD-同步,异步分别在串行队列,并发队列,主队列下的执行方式

GCD-同步,异步分别在串行队列,并发队列,主队列下的执行方式    - (void)viewDidLoad {     [super viewDidLoad];       ...
  • yst19910702
  • yst19910702
  • 2016年06月25日 11:12
  • 208

GCD 串行队列,并发队列和主队列的整理

1.串行队列:Dispatch Queues或者 Serial Queues 同步 dispatch_queue_t queue = dispatch_queue_create("ze...
  • ydj213
  • ydj213
  • 2014年07月10日 10:39
  • 617
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:主队列,全局队列,并发队列关系比较
举报原因:
原因补充:

(最多只允许输入30个字)