zoukankan      html  css  js  c++  java
  • GCD 多线程 Ios

    touchesbegan中调用demo1方法,执行这段代码

    这段代码有什么问题?打印顺序是怎样的?理论上来说:4打印穿插在123当中.可是结果不太理想.先给你们看下打印结果

    分析一下原因:123都在同一个串行队列当中,所以一定是这个顺序打印,串行队列要一个一个执行任务嘛.我们看4是在主队列当中执行的

    那么现在有两个队列一个是我们自习创建的一个是系统的主队列,主队列在主线程执行,我们创建的队列在子线程执行,两个队列两个线程

    理论打印结果是4可以出现在123中间的任何位置,或者在1之前,3之后,这是理论上的所有情况,4123,1423,1243,1234.4123这个顺序刚才打印我看到过,现在打印好多次不出这个结果,1234这个顺序一直没见到过,理论上是有的,可能执行次数不够多,没有看到过.没抓到.先说一下这些情况打印的原因:因为是两个队列两个线程,123在同一个对列中所以顺序一定是这样的.就是主队列和我们自己创建的队列执行顺序是不确定的,所以造成这样的结果

    为什么两个队列的顺序不确定,我把它归解到GCD透明优化和系统的原因,因为两个队列在两个线程执行,谁也不影响谁,不抢夺线程资源,所以哪个先执行哪个后执行就是GCD和系统的原因啦.

    那么这个打印结果是有问题的,正确的顺序是1234,登录--扣款-下载-更新UI,(在模拟购买软件的过程),那我们需要怎样写出正确的代码?

    这段代码将更新UI这个任务放到123这个串行队列当中,顺序执行,保证了一定要在123执行完成后才执行4这个任务.

    打印结果如下

    有点问题的就是为什么会先打印一次点击事件结束,上一篇文章中我已经提到过,不再赘述

    看懂了?ok再给你一段代码touchesbegan中调用此方法.

     

    首先能看出打印顺序么?会不会产生死锁?好的,看下打印结果.

    这段代码也实现了1234正常的顺序,登录--付款--下载--更新UI的功能,首先说明一下打印结果当中共出现了三个线程,但是注意每一次点击事件我们只用到

    两个线程,一个是主线程(系统自动创建,)一个是71行我们自己创建的子线程,至于打印结果出现了number = 3这个线程的问题是因为GCD透明优化和系统的原因,我们不用管理这些问题.只要清楚每次点击事件只有两个线程,两个队列(主队列和global)就可以了.

    然后说明一下为什么不是死锁:这个程序和我上一篇文章中的死锁有什么区别?来给你们看下死锁的代码

    相同点:异步执行当中嵌套同步执行,且都是加入同一个队列,没说block4,还没到他呢,

    不同点:死锁的队列是串行队列,我们这段代码的队列是并行队列,ok问题就在这里,且听我慢慢道来:

    71行开启一个新的子线程处理block1任务,执行到block2任务的时候,如果是串行队列就是死锁,并行队列为什么可以正常执行?

    注意了小伙伴,以下解释知识我写过很多测试代码,根据结果来推测的,可能不准确,也希望小伙伴们多多指教

    ok因为globe_queue是并行队列,里面的任务是无序的,什么意思?我先执行哪个都可以啊,执行block0时遇到block1,block0外面的函数是async函数,这个函数不用等待他的block0执行完就可以向下执行的.此时很巧我们的队列里面的任务又是无序的,更巧的是执行block0时遇到block1,GCD通过内部透明优化和系统经过一些商讨之后,就让block1先执行,block1执行完又回到block0,block0执行就到了block2,block2执行完回到block0,然后block3.  最后遇到block4,他就解放了,block4会主线程执行的,不用子线程执行,90行代码,主队列在主线程执行.那么为什么block4不是先执行呢?他有主线程来处理.不是应该和子线程各自执行自行的任务么?,但是block4block1当中,代码要顺序执行是不是,况且block1只有一个子线程来处理,这个子线程很忙一直在block1block2,block3之间切换,没有一刻闲暇,block4是有主线程执行,可是我要执行到block4才知道啊,block1,block2,block3前面的函数是什么,sync,这函数要等到它后面的block执行完才能向下执行.ok说完了

    补充:,多线程的管理大致有四种方式,为什么我们更多使用GCD?因为它简单,因为有了GCD我们不用关心线程什么时候创建什么时候销毁,不用考虑我到底用哪个线程去去处理那些任务,这些都是GCD给我们在内部自动优化的.有了GCD可以说线程就和我们没有太大的关系了,我们创建线程 ?没有!我们只是写了函数async,只要我们写了这个函数线程创建销毁都是GCD和系统的事情和我们没有关系.

    ok再给一张代码图结合打印结果小伙伴自己好好体会,如有错误欢迎指正,你看看这都几点了.苦逼的在这里学习交流,看看我打印代码结果的时间!么么哒  我爱你们~~!好梦亲们~~!

     

  • 相关阅读:
    第一个java程序
    Java安装
    Maven安装
    Effective Java 3
    gateway + jwt 网关认证
    idea的使用
    线程池的使用
    服务注册发现Eureka
    zookeeperAPI的常用方法
    sss
  • 原文地址:https://www.cnblogs.com/LDSmallCat/p/4910158.html
Copyright © 2011-2022 走看看