严格意义上来讲 在iOS 中只有 pthread 和 NSThread 是真正的多线程技术,可以直接进行多线程操作,GCD 和NSOperation 则属于并发技术,NSOperation属于对GCD的封装。
NSThread 的简单应用
NSThread常用创建 方法
NSThread *thread1 = [[NSThread alloc]initWithBlock:^{
NSLog(@"thread1");
}];
[thread1 start];
NSThread *thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(thread:) object:nil];
[thread2 start];
注意这两个方法 NSThread 需要手动调用 start 方法开始执行任务
-
(void)detachNewThreadWithBlock:(void (^)(void))block
-
(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument
detach的意思是分离 相当于创建新的的线程来执行任务 上边这两个方法可以直接执行任务不需要手动调用 start -
(void)sleepUntilDate:(NSDate *)date;
-
(void)sleepForTimeInterval:(NSTimeInterval)ti;
这两个类方法是让线程暂时睡眠用的 第一个方法是睡到什么时候,第二个方法是睡多久。
- (void)exit;
exit方法会杀掉当前线程。注意exit可以杀掉主线程!但是APP不会挂掉!!
- (void)start;
- (void)cancel;
start 和cancel 分别是开始和取消线程。
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
者两个方法是读取和设置线程优先级 取值范围 0 到 1,线程默认优先级 0.5,如果没有特殊需求苹果不建议修改线程优先级,否则有一定几率可能产生线程优先级翻转的情况( 有对应的实例变量 threadPriority 不过iOS 8.0 之后已经用NSQualityOfService qualityOfService 的枚举取代了)。
@property (nullable, copy) NSString *name
线程名字,调试代码的寻找bug 的时候很有用的多线程属性。在大型的商业项目中,通常希望程序在崩溃的时候,能够获取到程序准确的所以在的线程!
@property NSUInteger stackSize 实例变量
stackSize实例变量 线程的栈大小 普通线程默认512kb,可以手动设置,但是必须是4k的倍数,而且最小是16KB
线程的状态
内存中有一个专门的区域叫可调度线程池,由CPU进行调度操作。
通过前边的start 方法的调用我们可知线程是有状态的,具体有以下几个状态 :新建、就绪(添加入可调度线程池)、运行、阻塞(阻塞状态的时候线程会移出可调度线程池)、死亡(死亡状态的时候线程会移出可调度线程池)
线程间通信
在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信。线程间通信的体现,1个线程传递数据给另1个线程,在1个线程中执行完特定任务后,转到另1个线程继续执行任务
线程间通信常用方法
在NSThread 中有一个NSObject 的分类 用于简单方便的使用多线程中的线程间通信技术技术
@interface NSObject (NSThreadPerformAdditions)
-
(void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
-
(void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
-
(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
-
(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait ;
-
(void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
网友评论