OC_NSThread

  • 原文链接:iOS多线程--彻底学会多线程之『pthread、NSThread』
  • **NSThread **是苹果官方提供的,使用时需要程序员管理线程的声明周期(主要是创建),开发中我们经常会使用到[NSThread currentThread]来显示当前的进程信息。

1.创建、启动线程

  • 方式1:先创建线程,再手动启动线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread start];    //线程一启动,就会在thread中执行self的run方法;
  • 方式2:创建线程后自动启动线程
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
  • 方式3:隐式创建并启动线程
[self performSelectorInBackground:@selector(run) withObject:nil];

2.线程相关用法:

//获得主线程
+ (NSThread *)mainThread;

//判断是否为主线程(对象方法)
- (BOOL)isMainThread;

//获得当前线程
NSThread *current = [NSThread currentThread];

//线程的名字--setter方法
- (void)setName:(NSString *)n;

//线程的名字--getter方法
- (NSString *)name;

3. 线程状态控制方法

  • 启动线程方法
- (void)start;      //线程从就绪状态 -> 运行状态;当线程任务执行完毕,自动进入死亡状态;
  • 阻塞(暂停)线程方法
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterVal:(NSTimeInterval)ti;
  • 强制停止线程
+ (void)exit;    //线程进入死亡状态;

4. 线程的状态转换

  • 当我们新建一条线程 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];,在内存中的表现如下图:
OC_NSThread_第1张图片
Paste_Image.png
  • 当我们调用了[thread start];后,系统把线程对象放入可调度线程池中,线程对象进入就绪状态,如下图:
OC_NSThread_第2张图片
Paste_Image.png
  • 当然可调度线程池中,也会其他对象,如下图:
OC_NSThread_第3张图片
Paste_Image.png

线程状态的几种转换

  • 如果CPU调度当前线程对象,当前线程对象进入运行状态,如果CPU调度其他线程对象,当前线程对象回到就绪状态;
  • 如果CPU在运行当前线程对象时调用了sleep方法/等待同步锁,则当前线程对象进入阻塞状态;等到sleep结束/得到了同步锁,则回到就绪状态;
  • 如果CPU运行当前线程对象时任务执行完毕/异常强制退出,则当前线程对象进入死亡状态。
    具体变化如下图:
OC_NSThread_第4张图片
Paste_Image.png

你可能感兴趣的:(OC_NSThread)