主线程的作用:
- 显示\刷新UI界面
- 处理UI界面(比如点击事件、滚动事件、拖曳事件等)
优缺点:
- 优点:
- 能适当提高程序的执行效率
- 能适当提高资源利用率(CPU、内存利用率)
- 缺点:
- 创建线程需要开销,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对象进行访问](http://upload-images.jianshu.io/upload_images/1366387-d2605e5ac98a846c.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)