美文网首页
iOS 多线程基础 三、NSThread

iOS 多线程基础 三、NSThread

作者: PPFSaber | 来源:发表于2018-03-25 19:54 被阅读26次

严格意义上来讲 在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 方法的调用我们可知线程是有状态的,具体有以下几个状态 :新建、就绪(添加入可调度线程池)、运行、阻塞(阻塞状态的时候线程会移出可调度线程池)、死亡(死亡状态的时候线程会移出可调度线程池)

线程的状态.png

线程间通信

在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;

相关文章

网友评论

      本文标题:iOS 多线程基础 三、NSThread

      本文链接:https://www.haomeiwen.com/subject/cnjnqftx.html