zoukankan      html  css  js  c++  java
  • 4.0 多线程基础篇

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末
    如果觉得本文内容过长,请前往本人 “简书

    4.0-1.1 进程

    • 概念 : 进程是指在系统中正在运行的一个应用程序 (操作系统中每一个 APP 就是一个进程)  
    • 性质 : 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内

        进程为应用程序开辟独立的内存空间;(这块内存空间是独立的,受保护的!进程和进程之间是互不干扰的!)

    • 举例 : 比如同时打开QQ、Xcode,系统就会分别启动2个进程
    • 查看进程 : 通过“活动监视器”可以查看Mac系统中所开启的进程
    • 所有的 UI 操作和 UI 事件都是进程

    4.0-1.2 线程
    • 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)
    • 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行( 线程执行进程/应用程序中的代码)
    举例 : 比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行
     
    • 主线程:在一个应用程序启动之后,会默认开启一条线程
    • 子线程:主线程之外的线程(手动开启的)
     
    单个线程 - 串行:
    概念 : 1个线程中任务的执行是串行的(在线程中的代码是按顺序执行的!同一时间内,只能有一个代码块执行!)
    解析 : 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务
             也就是说,在同一时间内,1个线程只能执行1个任务
    举例 : 比如在1个线程中下载3个文件(分别是文件A、文件B、文件C), 只能一个一个的下载
    总结 : 因此,也可以认为线程是进程中的1条执行路径
     
     
    问题:为什么开启一条新线程之后就能解决卡住主线程这个问题了呢?
    答: 因为线程和线程之间是并发执行(同时执行)!
     
      多个线程 - 并行:多线程
    概念 : 1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务
    优点 : 多线程技术可以提高程序的执行效率
    举例 : 比如同时开启3条线程分别下载3个文件(分别是文件A、文件B、文件C), 则分别同时下载
     
     
    4.0-1.3 【区别】进程 & 线程
     
    进程是由许多条线程组成,一个进程可以包含很多条线程,每条线程都可以执行不同的代码!
    进程与线程的区别:
    (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
    (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
    (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
    (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
     
     
    4.0-2.1 多线程原理
    多线程原理:(为什么多条线程之间可以并发(同时)执行呢?)
    本质 : 同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
             多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
    原理 : 如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
    思考:如果线程非常非常多,会发生什么情况?
     
    答案 :
    如果线程非常多,会在多条线程之间来回切换,消耗大量的 CPU 资源
    • 每个线程被调度的次数会降低
    • 线程的执行效率会下降
     
    CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源
    每条线程被调度执行的频次会降低(线程的执行效率降低)

    iOS 8.0 主线程的默认堆栈大小也是 512K

     
     
     4.0-2.2 多线程优缺点
    多线程的优点 :
    (1) 能适当提高程序的执行效率:
    •  并发执行(同时执行): 线程和线程之间是同时执行的!(不同的线程中,任务同时执行)  
    (2) 能适当提高资源利用率(CPU、内存利用率)
     
    多线程的缺点 : (既然多线程这么爽, 线程是不是越多越好呢?)
    (1) 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB的栈区空间),如果开启大量的线程,会占用大量的内存空间,降低程序的性能
    (2) 线程开启越多,CPU 就需要在多条线程之间来回切换,CPU在调度线程上的开销就越大,CPU就越累!
    (3) 开启线程会提高代码的复杂性(会使应用程序增加很多代码!代码变多之后,程序复杂性就会提高!)
    程序设计更加复杂:比如线程之间的通信、多线程的数据共享
     
    建议: 在移动应用的开发中; 一般只开3~5条线程!
     
     
    4.0-2.3 多线程在iOS开发中的应用
     
    主线程 / UI线程:
    概念 : 一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程” (程序启动创建的线程)
    作用 : 
    • 显示 / 刷新UI界面
    • 处理UI事件(比如点击事件、滚动事件、拖拽事件等)
    使用注意 : 
    • 别将比较耗时的操作放到主线程中
    • 要将耗时操作放在后台线程执行,否则会影响 UI 的流畅度,给用户一种'卡顿'的坏体验,破坏用户体验
    • 所有网络访问都是耗时操作!
    解决方案 :
    • 将耗时操作放在子线程(后台线程、非主线程)
    • 那样就不会阻塞我们的主线程 , 一般开 3 ~ 6 条线程  
     
    好处 :
    • 在用户点击按钮那一刻就有反应
    • 能同时处理耗时操作和用UI控件的事件
     
    4.0-2.4 iOS中多线程的实现方案
     
     
     
     
     
     
     
     
     

    如果你觉得本篇文章对你有所帮助,请点击右下部“推荐”,^_^
     
     
    作者:蓝田(Loto)
    出处:http://www.cnblogs.com/shorfng/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
     

    如有疑问,请发送邮件至 shorfng@126.com 联系我。
     
     
      
  • 相关阅读:
    HearthBuddy投降插件2019-11-01的使用
    正则表达式在线分析 regex online analyzer
    Tips to write better Conditionals in JavaScript
    The fileSyncDll.ps1 is not digitally signed. You cannot run this script on the current system.
    Cannot capture jmeter traffic in fiddler
    JMETER + POST + anti-forgery token
    input type color
    HearthBuddy修改系统时间
    What are all the possible values for HTTP “Content-Type” header?
    UDK性能优化
  • 原文地址:https://www.cnblogs.com/shorfng/p/5315593.html
Copyright © 2011-2022 走看看