美文网首页
GCD-同步、异步、串行、并行的组合执行情况

GCD-同步、异步、串行、并行的组合执行情况

作者: 一双鱼jn | 来源:发表于2018-05-26 12:47 被阅读30次
    • 同步 : 1 等待该任务执行完毕之后再继续向下执行。 2 不开启新的线程,在原来的线程执行。

    • 异步 : 将该任务提交到队列。继续向下执行。不等待任务执行完毕。可以开启新的线程来执行任务,由系统来调度

    • 串行队列 :只会有一条线程来执行这个队列的任务。

    • 并发队列 :可以将队列里的任务逐个交给多个线程去同时执行。

      既然是队列,任务就会按顺序被取出来然后由线程去执行。

      并发队列是可以将任务1取出来交给线程1去执行,然后将任务2取出来交给线程2去执行。这样可以多个线程同时执行多个任务。达到并发的效果。当然这需要任务是异步执行的,否则会等待第一个任务执行完之后再执行。

      而串行队列是只能取出来一个任务交给一个线程执行,等这个线程执行完了这个任务再取一个任务交给这个线程去执行。不会有多个线程来取这个队列的任务。同步则是在当前线程执行,异步则是开一条新的线程来执行。


    同步操作在各队列下的情况

    dispatch_sync(queue,block)

    同步 + 主队列 = 死锁

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        dispatch_sync(dispatch_get_main_queue(), ^{
            // do something
        });
    }
    
    同步主队列

    同步 + 串行队列

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
        dispatch_sync(queue, ^{
            // do somethings
        });
    }
    

    执行到这里,主线程将该任务提交到串行队列中

    由于是同步方法,所以主线程会等待这个任务执行完毕再向下执行。

    并且因为是同步方法,所以这个任务不会开新的线程来执行,还是由原来的线程执行。

    也就是说主线程等这个串行队列中前面的任务执行完毕之后,执行这个任务。执行了这个任务之后向下继续执行。

    这种操作没有太大的必要。

    图示

    同步串行队列

    同步 + 并发队列

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_sync(queue, ^{
            // do somethings
        });
    }
    

    相比于同步串行队列,该任务等待时间会短一点,因为是并发队列,前面的任务会被其他线程去执行。其他的基本相同

    图示

    同步并发队列执行

    异步操作在各队列下的情况

    dispatch_async(queue,block)

    异步 + 主队列

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        dispatch_async(dispatch_get_main_queue(), ^{
            // do something
        });
    }
    

    将任务添加到主队列的最后。

    图示

    异步主队列执行图

    异步 + 串行队列

    将任务提交到指定的串行队列。

    - (void)viewDidLoad {
        [super viewDidLoad];
        dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
        dispatch_async(queue, ^{
            // do something
        });
    }
    

    因为是异步的,所以主线程将任务提交到这个串行队列之后就可以继续执行。不会卡住主线程。

    同样因为是异步的,所以会开启一条子线程来执行这个串行队列中的任务。

    因为是串行队列,所以只有一条线程来执行这个队列中的任务。那么该任务就得等前面的任务被该线程执行完了才能被执行。

    图示

    异步串行队列图示

    异步 + 并发队列

    - (void)viewDidLoad {
        [super viewDidLoad];
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            // do something
        });
    }
    

    将任务提交到并发队列,因为是异步的,所以不会阻塞主线程,主线程将任务提交到队列之后继续从向下执行。

    因为是在并发队列,所以该任务不用等前面的任务完成之后再执行,只要前面的任务被线程开始执行了,接下来就会将该任务分配给一条线程去执行。

    异步并行队列图示

    相关文章

      网友评论

          本文标题:GCD-同步、异步、串行、并行的组合执行情况

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