美文网首页
iOS多线程之GCD(简单的说说)

iOS多线程之GCD(简单的说说)

作者: ios软件开发学习 | 来源:发表于2017-08-12 17:46 被阅读0次

    好久没有来部落发表文章了,今天自己回顾一下GCD吧,这在以后的开发中最常用的。说到GCD,必须强调队列和任务两个词,很多人容易搞混(当然,本人一开始接触ios也是一样懵逼),队列其实就跟物理课上的串联,并联电路差不多吧,任务就是同异步之分,同步不开启线程,异步开启新线程。这里就简单明了的说下吧:

    点击链接加入群【ios开发学习】:https://jq.qq.com/

    队列:

    串行队列:在队列中多个线程中有序进行;

    并行队列:在队列中多个线程同时进行,没有顺序;

    任务:

    同步: sync ,它会阻塞当前线程,等待队列中的任务执行完毕,然后当前线程才会继续;

    异步:async,不会阻塞线程,会直接往下执行;

    代码:

    1.主线程队列:

    主线程异步队列中,也是顺序执行的,主线程中有任务,必须等主线程中的任务执行完毕才执行主队列,如果主线程中使用同步队列将会导致线程锁死,这点要注意,锁死的原因是循环等待,主队列的东西要等主线程执行完,而因为同步执行不能开线程,所以下面的任务要等上面的任务执行完,所以锁死。

    //主异步:在主线程中顺序执行

    dispatch_queue_tmain =dispatch_get_main_queue();

    for(inti =0; i <10; i++) {

    dispatch_async(main, ^{

    NSLog(@"主队列,异步%@",[NSThreadcurrentThread]);

    });

    }

    }

    //主同步:会造成线程锁死

    dispatch_queue_tmain =dispatch_get_main_queue();

    for(inti =0; i <0; i++) {

    dispatch_sync(main, ^{

    NSLog(@"你这是要锁死我%@",[NSThreadcurrentThread]);

    });

    }

    2.串行队列:

    //串行同步:不开线程,在当前线程中有序的进行

    dispatch_queue_tqueue =dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);

    for(inti =0; i <10; i++) {

    dispatch_sync(cxTongB, ^{

    NSLog(@"串行队列,同步%@",[NSThreadcurrentThread]);

    });

    }

    //串行异步:开启一条线程,然后有序的执行

    dispatch_queue_tqueue =dispatch_queue_create("YIBU",DISPATCH_QUEUE_SERIAL);

    for(inti =0; i <10; i++) {

    dispatch_async(queue, ^{

    NSLog(@"串行队列,异步%@",[NSThreadcurrentThread]);

    });

    }

    3.并行队列

    //并行同步:不开启线程,在当前线程有序进行

    dispatch_queue_tbxtongbu =dispatch_queue_create("bxtongbu",DISPATCH_QUEUE_CONCURRENT);

    for(inti =0; i <10; i++) {

    //同步执行

    dispatch_sync(bxtongbu, ^{

    NSLog(@"并行队列,同步%@",[NSThreadcurrentThread]);

    });

    }

    //并行异步:开启多条线程,并发执行

    dispatch_queue_tqueue =dispatch_queue_create("bxYibu",DISPATCH_QUEUE_CONCURRENT);

    for(inti =0; i <10; i++) {

    dispatch_sync(queue, ^{

    NSLog(@"并行队列,异步%@",[NSThreadcurrentThread]);

    });

    }

    总结:

    1. 开不开线程,取决于执行任务的函数,同步不开,异步开。

    2. 开几条线程,取决于队列,串行开一条,并发开多条(异步)

    3. 主队列:专门用来在主线程上调度任务的"队列",主队列不能在其他线程中调度任务

    4. 如果主线程上当前正在有执行的任务,主队列暂时不会调度任务的执行!主队列同步任务,会造成死锁。原因是循环等待

    5. 同步任务可以队列调度多个异步任务前,指定一个同步任务,让所有的异步任务,等待同步任务执行完成,这是依赖关系。

    6. 全局队列:并发,能够调度多个线程,执行效率高,但是相对费电。 串行队列效率较低,省电省流量,或者是任务之间需要依赖也可以使用串行队列。

    7. 也可以通过判断当前用户的网络环境来决定开的线程数。

    想学习iOS的小伙伴们可以加裙一起交流哦!626433463

    相关文章

      网友评论

          本文标题:iOS多线程之GCD(简单的说说)

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