美文网首页
串行队列,并发队列以及同步执行,异步执

串行队列,并发队列以及同步执行,异步执

作者: 晓叶 | 来源:发表于2017-08-03 17:09 被阅读17次

串行队列:同一时间队列中只有一个任务在执行,每个任务只有在前一个任务执行完成后才能开始执行。主队列(通过dispatch_get_main_queue()获取,提交至主队列的任务会在主线程中执行) 就是串行队列,也可以使用dispatch_queue_create创建串行队列。

并发队列:这些任务会按照被添加的顺序开始执行。但是任意时刻有多个Block(任务)运行,这个完全是取决于GCD。并发队列可以使用dispatch_queue_create创建,也可以获取进程中的全局队列,全局队列有:高、中(默认)、低三个优先级队列。可以调用dispatch_get_global_queue函数传入相应优先级来访问队列。

同步执行:阻塞当前线程,直到当前block中任务执行完毕才返回。同步并不创建新线程。不能使用sync将任务添加到主队列,这样会造成死锁。

异步执行:不会阻塞当前线程,函数会立即返回, block会在后台异步执行;异步必定会开启新线程。

串行队列+同步执行
        dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);
        
        for (int i = 0; i< 1000;i++){
            
//            if (i%2 == 0) {
                dispatch_sync(serialQueue, ^{//同步执行
                    NSLog(@"%@--%d",[NSThread currentThread], i);
                });
//            }else{
//                dispatch_async(serialQueue, ^{//异步执行
//                    NSLog(@"%@--%d",[NSThread currentThread], i);
//                });
//            }

        }
        
串行队列+同步执行.png

总结:串行队列+同步执行,任务只会在同一线程执行,并且是当前线程按照顺序执行

串行队列+异步执行
        dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);
        
        for (int i = 0; i< 1000;i++){
            
//            if (i%2 == 0) {
//                dispatch_sync(serialQueue, ^{//同步执行
//                    NSLog(@"%@--%d",[NSThread currentThread], i);
//                });
//            }else{
                dispatch_async(serialQueue, ^{//异步执行
                    NSLog(@"%@--%d",[NSThread currentThread], i);
                });
//            }

        }
串行队列+异步执行.png

总结:串行队列+异步执行,任务不会再当前线程执行,会新开辟一条线程,在使队列中的任务按照顺序在新开辟的线程中执行.

串行队列+(同步执行+异步执行)
        
        dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);
        
        for (int i = 0; i< 1000;i++){
            
            if (i%2 == 0) {
                dispatch_sync(serialQueue, ^{//同步执行
                    NSLog(@"%@--%d",[NSThread currentThread], i);
                });
            }else{
                dispatch_async(serialQueue, ^{//异步执行
                    NSLog(@"%@--%d",[NSThread currentThread], i);
                });
            }

        }
串行队列+(同步执行+异步执行).png

总结:串行队列+(同步执行+异步执行),其中同步执行的任务会在当前线程执行,异步执行的任务会开辟新的线程执行,然而因为多次在当前线程和开辟的新的线程中切换,所以新开辟的线程可能不一定都是一条.

并发队列+同步执行
        dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);
        
        for (int i = 0; i< 1000;i++){
            
//            if (i%2 == 0) {
                dispatch_sync(serialQueue, ^{//同步执行
                    NSLog(@"%@--%d",[NSThread currentThread], i);
                });
//            }else{
//                dispatch_async(serialQueue, ^{//异步执行
//                    NSLog(@"%@--%d",[NSThread currentThread], i);
//                });
//            }

        }
并发队列+同步执行.png

总结:并发队列+同步执行,队列中的任务会在新的线程中按照顺序执行.

并发队列+异步执行
        dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);
        
        for (int i = 0; i< 1000;i++){
            
//            if (i%2 == 0) {
//                dispatch_sync(serialQueue, ^{//同步执行
//                    NSLog(@"%@--%d",[NSThread currentThread], i);
//                });
//            }else{
                dispatch_async(serialQueue, ^{//异步执行
                    NSLog(@"%@--%d",[NSThread currentThread], i);
                });
//            }

        }
并发队列+异步执行.png

总结:并发队列+异步执行,队列中的任务会随机开辟多个新的线程执行任务,并且是无序.

并发队列+(同步执行+异步执行)
        dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);
        
        for (int i = 0; i< 1000;i++){
            
            if (i%2 == 0) {
                dispatch_sync(serialQueue, ^{//同步执行
                    NSLog(@"%@--%d",[NSThread currentThread], i);
                });
            }else{
                dispatch_async(serialQueue, ^{//异步执行
                    NSLog(@"%@--%d",[NSThread currentThread], i);
                });
            }
        }
并发队列+(同步执行+异步执行).png

总结:并发队列+(同步执行+异步执行),队列中同步执行的任务按顺序在当前线程中执行,队列中异步执行的任务随机开辟新线程无序执行

相关文章

  • iOS GCD笔记

    串行队列 并发队列 主队列 全局并发队列 同步执行 异步执行 同步+并发队列 = 没有开启新线程,串行执行任务 s...

  • iOS - 多线程(二) GCD讲解

    目录: 1.GCD简介2.串行队列 + 同步执行3.串行队列 + 异步执行4.并发队列 + 同步执行5.并发队列 ...

  • iOS开发-队列和同步异步执行的结果分析

    多线程中的队列有:串行队列,并发队列,全局队列(并发),主队列(串行)。 执行的方法有:同步执行和异步执行。 提到...

  • GCD小总结

    单例模式 串行队列同步/异步执行任务 并发队列同步/异步执行任务 队列组 延时执行 barrier

  • 多线程GCD笔记

    同步函数 + 主队列 异步函数 + 主队列 同步函数 + 串行队列 异步函数 + 串行队列 同步函数 + 并发队列...

  • GCD的几种创建方式及基本使用

    同步函数 同步函数+主队列 同步函数+串行队列 同步函数+并发队列 异步函数 异步函数+主队列 异步函数+串行队列...

  • 队列dispatch_queue的使用

    队列分为:串行队列、并发队列和主队列,主队列也叫特殊串行队列,是GCD自带的。 任务的执行分为:同步执行和异步执行...

  • 多线程的运用

    同步串行队列 同步并发队列 异步串行队列 异步并发队列 队列组 栅栏 队列组和栅栏的组合 信号量 死锁主线程 分析...

  • 关于GCD总结

    什么是GCD 理解串行、并发及同步异步 串行和并发 同步和异步 队列 串行队列 两者等效.2)使用主队列(在主队列...

  • GCD各种情况整理

    01 异步函数+并发队列:开启多条线程,并发执行任务02 异步函数+串行队列:开启一条线程,串行执行任务03 同步...

网友评论

      本文标题: 串行队列,并发队列以及同步执行,异步执

      本文链接:https://www.haomeiwen.com/subject/rxeplxtx.html