多线程概述

2016-03-17  本文已影响24人  CoderJackieYip

主线程的作用:

  1. 显示\刷新UI界面
  2. 处理UI界面(比如点击事件、滚动事件、拖曳事件等)

优缺点:

  1. 优点:
  • 能适当提高程序的执行效率
  • 能适当提高资源利用率(CPU、内存利用率)
  1. 缺点:
  • 创建线程需要开销,iOS下主要成本包括:
  • 内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB、也可以使用-setStackSize:设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间
  • 如果开启大量线程,会降低程序性能(iOS移动端,2-3条线程适宜)
  • 线程越多,CPU在调度线程上的开销就越大
  • 程序设计更复杂:比如线程之间的通信、多线程的数据共享

实现方案

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

线程的状态

线程状态

线程只有在可调度线程池中,才可以被执行,未销毁且不在可调度线程池中的线程,意味该线程处于“阻塞”状态;销毁了的线程也将在可调度线程池中消失

线程安全

线程安全分析
线程安全解决方案:互斥锁

互斥锁:使用的是线程同步技术
线程同步:多条线程在同一条线程上执行(按顺序执行任务)

@synchronized(锁对象) {//需要锁定的代码}```
移动端尽量使用nonatomic(非原子属性,非线程安全),尽量将加锁、资源抢夺的业务逻辑交给服务器端的护理,减少移动端的压力

###线程之间通信的一种比较古老经典且复杂的方法:通过NSPort对象进行访问
每个线程都有一个RunLoop,每个RunLoop都有Port对象(NSMessagePort\NSMachPort\...),线程A想访问线程B,B会返回一个Port(NSMachPort)对象让A拥有,A将通过这个Port去访问B
![线程间通过NSPort对象进行访问](https://img.haomeiwen.com/i1366387/d2605e5ac98a846c.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上一篇下一篇

猜你喜欢

热点阅读