面试iOS 多线程[0002]iOS线程相关

iOS多线程知识点总结之: 进程和线程

2016-07-27  本文已影响1699人  devZhang

最近准备找工作, 所以又把多线程的知识再学习总结一遍, 让自己更好的熟悉和运用 iOS 多线程的相关操作.

进程

线程

线程的串行

一个线程中任务的执行是串行的, 也就是说同一时间内一个线程只能执行一个任务

进程和线程的比较

  1. 线程是 CPU 调用的最小单位
  2. 进程是 CPU 分配资源和调度的单位
  3. 一个程序可以对应过个进程,一个进程中可有多个线程,但至少要有一条线程
  4. 同一个进程内的线程共享进程资源

多线程

一个进程可以开启多条线程,每条线程可以并行执行不同的任务. 这个技术可以提高程序的执行效率

多线程原理

多线程的优点和缺点

优点

缺点

多线程在 iOS 开发中的应用

主线程

一个 iOS 程序运行后, 默认会开启一条线程, 成为"主线程"或者"UI 线程"

主线程的主要作用

主线程的注意点

获得主线程

[NSThread mainThread];

获得当前线程

[NSThread currentThread];

判断是否为主线程

 // 类方法
  BOOL isMainA = [NSThread isMainThread];
  // 对象方法
  BOOL isMainB = [thread isMainThread];

返回值为1, 就是主线程

耗时操作演示
界面添加一个按钮, 给按钮添加一个事件, 通过打印当前线程可是事件是在主线程操作的,

NSLog(@"currentThread = %@", [NSThread currentThread]);

打印信息

currentThread = <NSThread: 0x7fcd3a504ec0>{number = 1, name = main}

再给界面添加一个可以滚动的控件,例如 textView,然后让点击事件重复很多次打印操作, (比如999999次),

for (int i = 0; i < 99999; ++i) {
    NSLog(@"currentThread= %@, 已执行次数=%d", [NSThread currentThread], i + 1);
  }

这个时候发现再去拖拽 textView 已经没反应了, 控制台也一直在打印,下面是部分打印结果

...
2016-07-27 13:26:09.172 多线程[70885:788878] currentThread= <NSThread: 0x7fdfc0f03570>{number = 1, name = main}, 已执行次数=7258
2016-07-27 13:26:09.173 多线程[70885:788878] currentThread= <NSThread: 0x7fdfc0f03570>{number = 1, name = main}, 已执行次数=7259
2016-07-27 13:26:09.173 多线程[70885:788878] currentThread= <NSThread: 0x7fdfc0f03570>{number = 1, name = main}, 已执行次数=7260
2016-07-27 13:26:09.173 多线程[70885:788878] currentThread= <NSThread: 0x7fdfc0f03570>{number = 1, name = main}, 已执行次数=7261
...

此时说明主线程已经被堵塞了,只有在所有打印任务执行完毕后,才能进行其他操作

iOS 中多线程的实现方案

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

今天就先总结这么多, 下次逐个分析多线程的每种实现方案, 因为第一种 pthread 几乎不用, 就不分析了, 下篇从 NSThread 开始.

相关文章:
iOS多线程实现方案之--NSThread
iOS多线程实现方案之--GCD

上一篇下一篇

猜你喜欢

热点阅读