多线程代码执行先后的顺序问题

作者: Mg明明就是你 | 来源:发表于2016-08-25 10:16 被阅读586次
  • 前言
    • 多线程代码执行先后的是怎样的呢?我认为执行代码的先后顺序最外层的dispatch_sync(同步)和dispatch_async(异步)。究竟是不是这样呢?就让我来做以下验证吧。

1、同步(串行/并行)队列

- (void)viewDidLoad {
    [super viewDidLoad];
    [self test];
}

/** 输出
 *  DISPATCH_QUEUE_CONCURRENT : 1 2 3 4 13 14 7 8 5 6
 
 *  DISPATCH_QUEUE_SERIAL: 1 2 3 4 13 14 7 8 5 6
 */
- (void)test{
    NSLog(@"ming -- 1");
    NSLog(@"ming -- 2");
//                                                              DISPATCH_QUEUE_SERIAL
    dispatch_queue_t queue = dispatch_queue_create("mingming2", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_sync(queue, ^{
        NSLog(@"ming -- 3");
        NSLog(@"ming -- 4");
        NSLog(@"ming -- 13");
        NSLog(@"ming -- 14");
        
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"ming -- 5");
            [NSThread sleepForTimeInterval:5.0];
            NSLog(@"ming -- 6");
        });
        NSLog(@"ming -- 7");
    });
    NSLog(@"ming -- 8");
    NSLog(@"+=====+++++++++++++=============+++++++++++++++++++++++++====");
}
test结果.png

2、异步全局队列

- (void)viewDidLoad {
    [super viewDidLoad];
    [self test2];
}

/** 输出
 *  1 2 8 3 4 7 5 6
 */
- (void)test2{
    NSLog(@"ming -- 1");
    NSLog(@"ming -- 2");
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"ming -- 3");
        NSLog(@"ming -- 4");
        
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"ming -- 5");
            [NSThread sleepForTimeInterval:5.0];
            NSLog(@"ming -- 6");
        });
        NSLog(@"ming -- 7" );
    });
    NSLog(@"ming -- 8");
    NSLog(@"+=====+++++++++++++=============+++++++++++++++++++++++++====");
}```
![test2结果.png](http:https://img.haomeiwen.com/i1429890/bf0b2987b5a79517.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- ####补充两张dispatch_async图片:
![](http:https://img.haomeiwen.com/i1429890/15756ef5d314ee60.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http:https://img.haomeiwen.com/i1429890/12d26162f53ba200.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![打印.png](http:https://img.haomeiwen.com/i1429890/b0bbeb3204343b27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- #####总结:异步同时执行,并没有明显的先后顺序之分。
***

#3、同步全局队列
  • (void)viewDidLoad {
    [super viewDidLoad];
    [self test3];
    }

/** 输出

  • 1 2 3 4 7 8 5 6
    */
  • (void)test3{
    NSLog(@"ming -- 1");
    NSLog(@"ming -- 2");

    dispatch_sync(dispatch_get_global_queue(0, 0), ^{
    NSLog(@"ming -- 3");
    NSLog(@"ming -- 4");

      dispatch_async(dispatch_get_main_queue(), ^{
          NSLog(@"ming -- 5");
          [NSThread sleepForTimeInterval:5.0];
          NSLog(@"ming -- 6");
      });
      NSLog(@"ming -- 7");
    

    });
    NSLog(@"ming -- 8");
    }

![test3结果.png](http:https://img.haomeiwen.com/i1429890/2bf1cb883a1c1358.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
***

#总结,通过三处代码。通过同步/异步、串行/并发(全局/主线程)的组合,可以看出,执行代码的先后顺序最外层的dispatch_sync(同步)和dispatch_async(异步)。
- `dispatch_sync(同步)——同步的话就按顺序执行,先执行最外层的dispatch_sync的代码,再执行NSLog(@"ming -- 8");,最后执行 dispatch_async(dispatch_get_main_queue(), ^{代码});里面的代码。`

- `dispatch_async(异步)——异步的话就不按顺序执行,先执行NSLog(@"ming -- 8");,再执行最外层的dispatch_async的代码,最后执行 dispatch_async(dispatch_get_main_queue(), ^{代码});里面的代码。`

- Tip
>值得注意的是dispatch_sync(同步)的时候,如果是
```dispatch_sync(dispatch_get_global_queue(0, 0), ^{
     dispatch_sync(dispatch_get_main_queue(), ^{});
}```
这种情况,在同步线程执行主队列,会造成死锁.如下图代码所示:

dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSLog(@"ming -- 3");

    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"ming -- 5");
        [NSThread sleepForTimeInterval:5.0];
        NSLog(@"ming -- 6");
    });
    NSLog(@"ming -- 7");
});```

相关文章

  • 多线程代码执行先后的顺序问题

    前言多线程代码执行先后的是怎样的呢?我认为执行代码的先后顺序最外层的dispatch_sync(同步)和dispa...

  • java类初始化顺序

    1.静态代码块,静态变量,按代码顺序先后执行.2.构造代码块,成员变量,按代码顺序先后执行.3.先执行构造块或成员...

  • 什么是有序性

    程序按照代码的先后顺序执行

  • 线程按指定顺序执行

    在多线程中线程的执行是CPU随机调度的,无法指定线程的执行顺序,比如我们要让多线程按顺序执行输出 这段代码的输出顺...

  • 静态代码块,构造方法块,构造方法加载执行的先后顺序

    静态代码块>构造方法块>构造方法, 代码按上述先后顺序执行

  • js代码的异步执行方式

    由于JavaScript的执行环境是单线程的,导致js代码的两种执行方式: 以js代码的先后顺序执行的顺序型 以事...

  • js执行上下文

    JS代码的执行顺序有时与代码先后顺序有所差异,抛开异步代码,即使是同步代码,它的执行也与你的预期不一致,比如: 按...

  • 多线程(1)

    多线程目的: 解决效率问题,我们平时写的代码,大多可以理解为单线程执行,即顺序执行,一个流程执行完成后,再执行另外...

  • Java中的代码块,内部类

    代码块 1.概念 Java中用{ }括起来的代码段就是代码块,类里面可以有多个代码块,执行顺序和出现的先后顺序相同...

  • 多线程顺序执行问题

    编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果...

网友评论

    本文标题:多线程代码执行先后的顺序问题

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