一.多线程实现方案
1>pthread
1)语言:C语言
2)特点: (1)通用的多线程API
(2)适用于Unix\Linux\Windows等
(3)跨平台\可移植
(4)使用难度大
3)生命周期:程序员管理
示例:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //1.创建一个pthread对象 pthread_t thread; //2.创建线程 /* 第一个参数:线程对象,需要传地址 第二个参数:线程的一些属性,可以传NULL 第三个参数:该线程创建后要调用的方法,注意这里是一个指向函数的指针 第四个参数:第三个参数(函数指针)中接收的参数,如果没有那么传NULL */ pthread_create(&thread, NULL, run, NULL); pthread_t thread2; pthread_t thread3; pthread_create(&thread2, NULL, run, NULL); pthread_create(&thread3, NULL, run, NULL); } void *run(void * param) { NSLog(@"--run--%@",[NSThread currentThread]); return NULL; }
2>NSThread
1)语言:OC语言
2)特点: (1)可以对线程状态操作,简单易用
(2)使用更加面向对象
3)生命周期:程序员管理
注意的地方:
1)创建线程的四种方法 alloc initwith..|detachNewThread|performSelectorInBack..|自定义
2)设置线程的属性(名称&优先级[0.0~1.0])
3)NSThread创建线程的生命周期:当任务执行完毕的时候被释放
3>GCD(任务+队列)
1)语言:C语言
2)特点: (1)能够充分利用设备多核,并且是自动的
(2)旨在替代NSThread等线程技术
3)生命周期:自动管理
注意的地方:
1)全局并发队列,是系统自带的队列,需要的时候调用即可,一共有四种,它们的优先级是默认存在的.苹果官方文档指出,栅栏函数对它们无效.
2)主队列,凡是添加到主队列中的任务都是在主线程中执行的.
3)使用步骤:封装任务-->把任务丢给队列,系统会按照FIFO原则把任务给对应的线程处理
4)同步函数+串行队列 -->不会开线程,所有的任务串行执行
同步函数+并发队列 -->不会开线程,所有的任务串行执行
同步函数+主队列 -->死锁(因为主队列调度任务时会先检查主线程状态,如果主线程发现忙着会暂停调度,所以这种情况会死锁)
异步函数+串行队列 -->会开一条线程,所有的任务串行执行
异步函数+并发队列 -->会开多条线程,所有的任务并发执行
异步函数+主队列 -->不会开线程,所有的任务串行执行
5)iOS6.0之前,creat一次就release一次.iOS6.0之后纳入ARC管理
6)其他常用函数
①栅栏函数-->用来控制任务的执行顺序,但是不能用全局并发队列(苹果官方文档是这样说明的)
②一次性函数-->整个程序运行中,一次性代码只执行一次,可以用来实现单例模式(注意,不能放到懒加载中)
③延迟执行
④快速迭代(注意不能使用主队列)
⑤队列组的使用
4>NSOpreation(操作+队列)
1)语言:OC语言
2)特点: (1)它的底层是基于GCD,比GCD多了一些简单实用功能
(2)使用更加面向对象
3)生命周期:自动管理
注意的地方:
1)NSOperation用来封装操作,NSOpreationQueue用来存放任务
2)实现步骤:封装操作--->把操作添加到队列
3)对于NSBlockOperation,可以追加任务,如果一个操作中有多个任务,那么会开子线程,但不一定在子线程中处理
4)自定义NSOpreation --->重写内部的Main方法,有利于代码的封装和复用
5)非主队列同时具备串行和并发功能,默认是并发队列,通过控制最大并发数来实现
6)把操作添加到队列中的方法内部会自动调用start方法
7)队列的挂起:YES-->暂停 , NO-->继续;(挂起只能挂起当前非处于执行状态的任务)
8)队列的取消:取消不可恢复;(苹果官方建议,如果是自定义的NSOpreation,每执行完一段耗时操作,就检查当前操作是否取消)
9)操作的依赖和监听:可以跨队列依赖,注意不要循环依赖就好了
2016-5-22 奈文摩尔