本文主要是讲述iOS多线程pthread与NSTread,更多IOS技术知识,请登陆疯狂软件教育官网。
简介
恰当的使用多线程编程可以提供任务的执行效率和系统资源的利用率
多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源
每个应用程序都有一个主线程,通常用来做UI界面刷新等
比较耗时的任务如果放在主线程中,可能会造成主线程的堵塞,无法响应用户操作,通常为耗时任务创建自己的线程,与主线程并发执行
多线程编程在一定程度上提高了系统资源的利用率和任务处理速度,但是线程不易过多,否则会引发以下问题。
过多的线程会造成处理机的频繁调度,线程调度需要消耗大量的系统资源。
同一进程下的多个线程共享进程的资源,多个线程对资源的访问需要实现同步,若线程过多会增加同步的难度,甚至无法实现。
iOS开发中实现多线程的方式
pthread
跨平台,适用于多种操作系统,可移植性强
是一套纯C语言的通用API,且线程的生命周期需要程序员自己管理,使用难度较大,通常不使用
NSThread
基于OC语言的API,使得其简单易用,面向对象操作
线程的声明周期由程序员管理,偶尔使用
GCD
基于C语言的API,充分利用设备的多核,旨在替换NSThread等线程技术
线程的生命周期,由系统自动管理,经常使用
NSOperation
基于OC语言API,底层是GCD,增加了一些更加简单易用的功能,使用更加面向对象
线程生命周期由系统自动管理,经常使用
pthread
创建线程
定义线程变量:
pthread_t thread
初始化线程变量:
pthread_create(&thread, NULL, run, NULL)
设置/获取线程的并发执行数
设置并发执行数:
int pthread_setconcurrency(int)
获取线程的并发执行数:
int pthread_getconcurrency(void)
执行单次任务(通常用来设计单例模式)
定义标记:
pthread_once_t onceToken
执行单次任务:
int pthread_once(pthread_once_t *, void (*)(void))
将线程状态转化为unjoinable状态,确保资源的释放
int pthread_detach(pthread_t)
退出线程
void pthread_exit(void *)
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)start
阻塞线程
+ (void)sleepUntilDate:(NSDate *)date
+ (void)sleepForTimeInterval:(NSTimeInterval)ti
取消线程
- (void)cancel,当前正在执行的线程不会立刻停止
强制退出线程
+ (void)exit
NSThread的其他操作
与主线程相关
+ (NSThread *)mainThread,获取主线程
+ (BOOL)isMainThread,判断当前线程是不是主线程
与当前线程相关
+ (NSThread *)currentThread,获取当前线程
判断线程的状态
\通过executing属性判断线程是否正在执行
\通过finished属性判断线程是否执行完毕
\通过cancelled属性判断线程是否被取消
线程同步
原因:多个线程访问同一资源,很可能会引起数据错乱和数据安全问题
解决方案:使用互斥锁来解决互斥资源访问问题,iOS中通常使用@synchronized(锁){}对临界资源进行锁定,通常使用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对象实现通信
疯狂软件教育拥有最专业的疯狂iOS学习线路图,不仅证明疯狂软件iOS无与伦比的课程深度,也证明了疯狂软件iOS深厚的技术底蕴;同时也指引了iOS学习者的自学方向。iOS培训采用全新的iMac苹果一体机教学,疯狂软件教育重点培养学员理解软件开发过程,形成良好的编码习惯,能独立完成iPhone手机和iPad平板电脑上App 开发,积累一定的项目经验,能满足企业对iOS相关的人才需求,短期内成就高薪iOS开发人才。如需了解更多,可以咨询QQ:544627560抢座热线:020-28309358 咨询QQ:707552864可登陆疯狂软件教育官网查询。
联系客服