多线程

基本概念

进程

  • 进程是指在系统中正在运行的一个应用程序
  • 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
  • 通过 活动监视器 可以查看 Mac 系统中所开启的进程

线程

  • 进程要想执行任务,必须得有线程,进程至少要有一条线程
  • 程序启动会默认开启一条线程,这条线程被称为主线程UI 线程
  • 线程是进程的基本执行单元,进程的所有任务都在线程中执行

多线程

  • 一个进程中可以开启多条线程,每条线程可以同时执行不同的任务

    • 进程 -> 公司
    • 线程 -> 员工
    • 主线程 -> 老板(第一个员工)
  • 多线程技术可以提高程序的执行效率

多线程原理

  • 同一时间,CPU只能处理一条线程,只有一条线程在执行
  • 多线程同时执行,其实是CPU快速地在多条线程之间切换
  • 如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
  • 如果线程非常多,会在多条线程之间来回切换,消耗大量的 CPU 资源
    • 每个线程被调度的次数会降低
    • 线程的执行效率会下降

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

多线程优缺点

优点

  • 能适当提高程序的执行效率
  • 能适当提高资源利用率(CPU、内存利用率)

缺点

  • 开启线程需要占用一定的内存空间,如果开启大量的线程,会占用大量的内存空间,降低程序的性能
  • 线程越多,CPU在调度线程上的开销就越大
  • 程序设计更加复杂:比如线程之间的通信、多线程的数据共享

主线程

  • 程序启动创建的线程,被称为主线程UI 线程
  • 主线程的作用
    • 显示/刷新 UI 界面
    • 处理 UI 事件:点击滚动拖拽等事件

注意:要将耗时操作放在后台线程执行,否则会影响 UI 的流畅度,破坏用户体验

  • 所有网络访问都是耗时操作!

iOS中多线程的实现方案

方案 简介 语言 线程生命周期 使用频率
pthread
    一套通用的多线程API适用于 Unix / Linux / Windows 等系统跨平台\可移植使用难度大
C 程序员管理 几乎不用
NSThread
    使用更加面向对象简单易用,可直接操作线程对象
OC 程序员管理 偶尔使用
GCD
    旨在替代NSThread等线程技术充分利用设备的多核
C 自动管理 经常使用
NSOperation
    基于GCD(底层是GCD)比GCD多了一些更简单实用的功能使用更加面向对象
OC 自动管理 经常使用

多线程基本概论multithread的更多相关文章

  1. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  2. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  3. iOS 多线程详解

    iOS开发 多线程 概览 机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发: 对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其 ...

  4. iOS多线程基本使用

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  5. JDK的多线程与并发库

    1.创建多线程 public class MultiThread { public static void main(String[] args) { // 通过继承Thread类 Thread th ...

  6. double check 解决单例模式的多线程并发问题

      最近被多线程问题(multi-thread issue)弄昏了头.以前虽然也知道系统里要考虑多线程问题,也无数次见到double-check的代码,但是由于自己碰到这方面的问题基本上就是从其他地方 ...

  7. iOS多线程 NSThread/GCD/NSOperationQueue

    无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...

  8. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  9. iOS-多线程基础

    进程与线程: 1>   一个应用程序对应一个进程,一个进程帮助程序占据一块存储空间 2>   要想在进程中执行任务,就必须开启线程,一条线程就代表一个任务 3>   一个进程中允许开 ...

随机推荐

  1. 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(二)

    之前简单的介绍了如何使用RF,在这一节里,主要介绍下Selenium2Library的API, 在线的地址是http://robotframework.org/Selenium2Library/Sel ...

  2. Android打造带透明圆弧的ImageView

    这几天因为项目需求,需要在ImageView上面叠加一层透明圆弧,并且在沿着圆弧的方向显示相应的文字,效果如下图所示: 拿到这个需求,首先想到的是自定义一个ImageView来实现此功能,即在onDr ...

  3. 慕课网-安卓工程师初养成-4-3 Java条件语句之多重 if

    来源:http://www.imooc.com/code/1355 多重 if 语句,在条件 1 不满足的情况下,才会进行条件 2 的判断:当前面的条件均不成立时,才会执行 else 块内的代码.例如 ...

  4. js获取服务器控件DropDownList所选中的各项属性

    var ddl = document.getElementById("DropDownList1"); alert(ddl.selectedIndex);//选择索引值 alert ...

  5. 洛谷P1204 [USACO1.2]挤牛奶Milking Cows

    P1204 [USACO1.2]挤牛奶Milking Cows 474通过 1.4K提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 请各位帮忙看下程序 错误 ...

  6. JavaScript实现样式表的简单切换

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  7. [JFinal 2] JFinal 开发框架

    导读:在这次和大家一起开发的今日开讲后台管理系统中,我们用的是JFinal框架.开始的时候,说是用SSH,心里一阵窃喜,刚刚做了网上商城的项目,对于这个框架还算是接触过了.JFinal却是个新货,心里 ...

  8. cacti快速安装

    一.cacti概述 1. cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户. ...

  9. 理解python可变类型vs不可变类型,深拷贝vs浅拷贝

    核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutable):数字,字符串,元组 这里的可变不可变,是指内存中的那块内容(value)是否可以被改变 ...

  10. OpenGL函数解析之glLoadIdentity()

    函数原型:void glLoadIdentity(void) 函数说明:调用glLoadIdentity()函数可以恢复初始坐标系,用一个4x4的单位矩阵来代替当前矩阵,实际上就是对当前矩阵进行初始化 ...