创建线程目的是为了开启一条新的执行路径,运行指定代码与主线程中的代码实现同时运行。
多线程优势:
(1)充分发挥多核处理器优势,讲不通现成分配给不同的处理器,真正进入“并行运算”状态;
(2)将耗时的任务分配给其他线程执行,由主线程负责统一更新界面会使应用流畅,用户体验更好;
多线程弊端:
(1)新建线程会消耗内存空间和cpu时间,县城太多会降低系统运行性能;
多线程误区:
(1)多线程是为了并发执行多项任务,不会提高单个算法本身的效率;
进程是什么?
(1)正在进行中的程序被称为进程,负责程序运行的内存分配
(2)每一个进程都有自己独立的虚拟内存空间
线程是什么?
(1)线程是进程中一个独立的执行路径(控制单元)
(2)一个进程中至少包括一条线程,即主线程
(3)可以将耗时的执行路径放在其他线程中执行,比如网络请求
三种多线程
第一种是GCD
(1)基于C语言的底层API
(2)用block定义任务,使用起来非常灵活便捷
(3)提供了更多的控制能力以及操作队列中所不能使用的底层函数
基本思想:用操作(block)放在队列中去执行
(1)操作用block定义
(2)队列负责调度任务执行所在的线程,以及具体的执行时间
(3)队列特点先进先出(FIFO)的,新添加之队列的操作都会在队尾。
GCD的函数都是以dispatch开头的。
GCD有四种类别的队列:
(1)并行队列
特点:没有队形,执行顺序不能控制
应用场景:并大执行任务,没有先后顺序
缺点:(1)不能控制执行顺序;(2)不能控制线程数量;创建n个线程
并行队列的同步任务,穿插运行,不需要创建线程
(2)串行队列
特点:依次执行
串行队列的同步任务,会在主线程上运行
异步任务,会并发执行,但是在串行队列中,任然会一次顺序执行
(3)全局队列
特点:与并行队列的区别是,不需要创建,执行效果相同。全局队列没有名称,调试时无法确认准确队形
(4)主线程队列
特点:(1)保证在主线程上执行;(2)异步任务,主线程上运行,会保持队列;(3)同步任务,阻塞(因为要等主线程被杀掉,但是一般主线程是不会被杀掉的)
线程的回收:
线程的回收室友队列负责的
下面是不同队列中嵌套dispatch_sync(同步任务)的结果:
(1)全局队列,都在主线程上执行,不会死锁
(2)并行队列,都在主线程上执行,不会死锁
(3)串行队列,会死锁,但是会执行同步操作之前的代码
(4)主线程队列。直接死锁
第二种是NSOperation,NSOperationQueue
(1)NSOperationQueue(操作队列)由GCD提供的队列模型是一套oc的API
(2)GCD提供更底层的控制,NSOperationQueue则是在GCD之上实现了一些方便的功能,更安全
(3)分成良种不同类型的队列:主队列和自定义队列
1.主队列运行在主线程上
2.自定义队列在后台执行
3.队列处理的任务是NSOperation的子类:(1)NSInvocationOperation;(2)NSBlockOperation。
(4)setMaxConcurrentOperationCount:
设置同事并发的线程数量,能够有效降低CPU和内存的开销(GCD不容易实现)
第三种是NSThread