iOS多线程-01-pthread与NSTread
作者:佚名    IOS开发编辑:admin   更新时间:2022-07-23
简介
iOS开发中实现多线程的方式
pthread
- 跨平台,适用于多种操作系统,可移植性强
- 是一套纯C语言的通用API,且线程的生命周期需要程序员自己管理,使用难度较大,通常不使用
NSThread
- 基于OC语言的API,使得其简单易用,面向对象操作
- 线程的声明周期由程序员管理,偶尔使用
GCD
- 基于C语言的API,充分利用设备的多核,旨在替换NSThread等线程技术
- 线程的生命周期,由系统自动管理,经常使用
NSOperation
- 基于OC语言API,底层是GCD,增加了一些更加简单易用的功能,使用更加面向对象
- 线程生命周期由系统自动管理,经常使用
pthread
NSThread
线程的生命周期操作
创建线程的方法
- - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument,此方法创建的线程需要手动启动
- + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument,创建线程后自动启动
- - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg,隐式创建线程并启动
配置线程
- 通过name属性设置线程名字
- + (BOOL)setThreadPRiority:(double)p设置线程的优先级
启动线程
阻塞线程
- + (void)sleepUntilDate:(NSDate *)date
- + (void)sleepForTimeInterval:(NSTimeInterval)ti
取消线程
- - (void)cancel,当前正在执行的线程不会立刻停止
强制退出线程
NSThread的其他操作
与主线程相关
- + (NSThread *)mainThread,获取主线程
- + (BOOL)isMainThread,判断当前线程是不是主线程
与当前线程相关
- + (NSThread *)currentThread,获取当前线程
判断线程的状态
- \通过executing属性判断线程是否正在执行
- \通过finished属性判断线程是否执行完毕
- \通过cancelled属性判断线程是否被取消
线程同步
- 原因:多个线程访问同一资源,很可能会引起数据错乱和数据安全问题
- 解决方案:使用互斥锁来解决互斥资源访问问题,(锁){}对临界资源进行锁定,通常使用self作为锁
- 注意:由于线程同步会消耗大量的资源,应尽量避免多个线程访问同一资源,且通常将线程同步的逻辑交由服务器端实现
线程之间的通信
- 从子线程回到主线程
- - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array
- array指定runLoop的模式,若为空,则不执行aselector
- 方法的调用者即为aselector的调用者
- - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
- 从一个线程到另一个线程(包括主线程)
- - (void)performSelector:(SEL)aSelector onThread:(NSThread )thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray )array
- - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait
- 也可以通过NSPort对象实现通信